#include <bits/stdc++.h>   using namespace std;   int A[200005];   int lazy[600005], ma[600005], mi[600005];   long long sum[600005];   void push_up(int cur) {     sum[cur] = sum[cur * 2] + sum[cur * 2 + 1];     ma[cur] = max(ma[cur * 2], ma[cur * 2 + 1]);     mi[cur] = min(mi[cur * 2], mi[cur * 2 + 1]);   }   void push_down(int cur, int l, int r) {     if (lazy[cur] == 0) return;     int mid = (l + r) / 2;     sum[cur * 2] = (lazy[cur] * 1ll * (mid - l + 1));     ma[cur * 2] = mi[cur * 2] = lazy[cur];     lazy[cur * 2] = lazy[cur];     sum[cur * 2 + 1] = (lazy[cur] * 1ll * (r - mid));     ma[cur * 2 + 1] = mi[cur * 2 + 1] = lazy[cur];     lazy[cur * 2 + 1] = lazy[cur];     lazy[cur] = 0;   }   int __ma;   void build(int cur, int l, int r) {     lazy[cur] = 0;     __ma = max(__ma, cur);     if (l == r) {       sum[cur] = mi[cur] = ma[cur] = A[r];       return;     }     int mid = (l + r) / 2;     build(cur * 2, l, mid);     build(cur * 2 + 1, mid + 1, r);     push_up(cur);   }   void modify_toMax(int cur, int l, int r, int cl, int cr, int Ma) {     if (mi[cur] >= Ma) return;     if (l >= cl && r <= cr) {       if (ma[cur] <= Ma) {         ma[cur] = mi[cur] = Ma;         sum[cur] = Ma * 1ll * (r - l + 1);         lazy[cur] = Ma;         return;       }     }     push_down(cur, l, r);     int mid = (l + r) / 2;     if (cl <= mid) modify_toMax(cur * 2, l, mid, cl, cr, Ma);     if (cr > mid) modify_toMax(cur * 2 + 1, mid + 1, r, cl, cr, Ma);     push_up(cur);   }   long long query_sum(int cur, int l, int r, int cl, int cr) {     if (l >= cl && r <= cr) return sum[cur];     push_down(cur, l, r);     int mid = (l + r) / 2;     long long ans = 0;     if (cl <= mid) ans += query_sum(cur * 2, l, mid, cl, cr);     if (cr > mid) ans += query_sum(cur * 2 + 1, mid + 1, r, cl, cr);     return ans;   }   int query_firSmallInd(int cur, int l, int r, int cl, int cr, int Ma) {     if (mi[cur] > Ma) return -1;     if (l == r) {       if (ma[cur] <= Ma) return r;       return -1;     }     push_down(cur, l, r);     int mid = (l + r) / 2;     if (cl <= mid) {       int ind = query_firSmallInd(cur * 2, l, mid, cl, cr, Ma);       if (ind != -1) return ind;     }     if (cr > mid) return query_firSmallInd(cur * 2 + 1, mid + 1, r, cl, cr, Ma);     return -1;   }   int query_maxPresum(int cur, int l, int r, long long Ma) {     if (l == r) {       if (ma[cur] <= Ma) return r + 1;       return r;     }     push_down(cur, l, r);     int mid = (l + r) / 2;     if (sum[cur * 2] <= Ma)       return query_maxPresum(cur * 2 + 1, mid + 1, r, Ma - sum[cur * 2]);     return query_maxPresum(cur * 2, l, mid, Ma);   }   int main() {     int n, m;     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i += 1) scanf( %d , &A[i]);     build(1, 1, n);     int a, b, c;     for (int i = 1; i <= m; i += 1) {       scanf( %d%d%d , &a, &b, &c);       if (a == 1) {         modify_toMax(1, 1, n, 1, b, c);       } else {         int lef, rig, cur_ind = b, ans = 0;         while (cur_ind <= n) {           lef = query_firSmallInd(1, 1, n, cur_ind, n, c);           if (lef == -1) break;           long long pre = 0;           if (lef > 1) pre = query_sum(1, 1, n, 1, lef - 1);           rig = query_maxPresum(1, 1, n, pre + c);           --rig;           c -= query_sum(1, 1, n, lef, rig);           ans += (rig - lef + 1);           cur_ind = rig + 2;         }         printf( %d n , ans);       }     }     return 0;   }