#include <bits/stdc++.h>   using namespace std;   const int MAXN = 2e5 + 3;   struct tree {     int l, r, minn, lazy;     long long sum;   } tre[MAXN << 2];   int n, m;   long long a[MAXN];   void build(int i, int l, int r) {     tre[i].l = l, tre[i].r = r;     tre[i].lazy = 0;     if (l == r) {       tre[i].minn = a[l];       tre[i].sum = a[l];       return;     }     int mid = l + r >> 1;     build(i << 1, l, mid);     build(i << 1 | 1, mid + 1, r);     tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);     tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;   }   void pushdown(int i) {     if (tre[i].lazy) {       tre[i << 1].minn = tre[i].lazy, tre[i << 1 | 1].minn = tre[i].lazy;       tre[i << 1].lazy = tre[i << 1 | 1].lazy = tre[i].lazy;       tre[i << 1].sum = 1ll * (tre[i << 1].r - tre[i << 1].l + 1) * tre[i].lazy;       tre[i << 1 | 1].sum =           1ll * (tre[i << 1 | 1].r - tre[i << 1 | 1].l + 1) * tre[i].lazy;       tre[i].lazy = 0;     }   }   int find_(int i, int l, int r, long long x) {     if (tre[i].l >= l && tre[i].r <= r) {       if (tre[i].minn > x) return 0;       if (tre[i].l == tre[i].r) {         if (tre[i].minn <= x) return tre[i].r;         return 0;       }       pushdown(i);       tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);       tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;       if (tre[i << 1].minn > x) return find_(i << 1 | 1, l, r, x);       return find_(i << 1, l, r, x);     }     if (tre[i].l == tre[i].r) return 0;     pushdown(i);     int ans = 0;     if (tre[i << 1].r >= l) ans = find_(i << 1, l, r, x);     if (!ans && tre[i << 1 | 1].l <= r) {       ans = find_(i << 1 | 1, l, r, x);     }     tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);     tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;     return ans;   }   void modify(int i, int l, int r, int delta) {     if (tre[i].l > r || tre[i].r < l) return;     if (tre[i].l >= l && tre[i].r <= r) {       tre[i].lazy = delta;       tre[i].minn = delta;       tre[i].sum = 1ll * (tre[i].r - tre[i].l + 1) * delta;       return;     }     pushdown(i);     modify(i << 1, l, r, delta);     modify(i << 1 | 1, l, r, delta);     tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);     tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;   }   bool flag;   void que(int i, long long &delta, int &tot) {     if (tre[i].l == tre[i].r) {       if (delta >= tre[i].sum) tot = max(tot, tre[i].r), delta -= tre[i].sum;       return;     }     pushdown(i);     tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);     tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;     if (tre[i << 1].sum <= delta) {       tot = max(tot, tre[i << 1].r);       delta -= tre[i << 1].sum;       que(i << 1 | 1, delta, tot);     } else {       que(i << 1, delta, tot);     }   }   void query(int i, int l, int r, long long &delta, int &tot) {     if (tre[i].l > r || tre[i].r < l || flag) return;     if (tre[i].l >= l && tre[i].r <= r) {       if (tre[i].sum <= delta) {         tot = max(tre[i].r, tot);         delta -= tre[i].sum;         return;       }       if (tre[i].l == tre[i].r) {         if (tre[i].sum <= delta) {           tot = max(tot, tre[i].r), delta -= tre[i].sum;         } else           flag = 1;         return;       }       flag = 1;       que(i, delta, tot);       pushdown(i);       tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);       tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;       return;     }     pushdown(i);     tre[i].minn = min(tre[i << 1].minn, tre[i << 1 | 1].minn);     tre[i].sum = tre[i << 1].sum + tre[i << 1 | 1].sum;     query(i << 1, l, r, delta, tot);     query(i << 1 | 1, l, r, delta, tot);   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++) scanf( %lld , &a[i]);     build(1, 1, n);     for (int i = 1; i <= m; i++) {       int x, op;       long long y;       scanf( %d%d%lld , &op, &x, &y);       if (op == 1) {         int tot = find_(1, 1, x, y);         if (!tot) continue;         modify(1, tot, x, y);       } else {         int an = 0;         while (x <= n) {           int tot = find_(1, x, n, y);           int tot1 = 0;           flag = 0;           query(1, tot, n, y, tot1);           if (tot == 0 || tot1 == 0) break;           an += tot1 - tot + 1, x = tot1 + 1;         }         printf( %d n , an);       }     }   }