#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 201000;
struct node {
  int l, r;
  long long sum, lazy, minl;
} a[MAX_N * 4];
void update(int k) {
  a[k].sum = a[k << 1].sum + a[k << 1 | 1].sum;
  a[k].minl = min(a[k << 1].minl, a[k << 1 | 1].minl);
}
int b[MAX_N];
void build(int k, int l, int r) {
  a[k].l = l;
  a[k].r = r;
  a[k].lazy = 0;
  if (l == r) {
    a[k].sum = b[l];
    a[k].minl = b[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
  update(k);
}
void pushdown(int k) {
  if (a[k].lazy == 0) return;
  a[k << 1].lazy = a[k << 1 | 1].lazy = a[k].lazy;
  a[k << 1].sum = a[k].lazy * (a[k << 1].r - a[k << 1].l + 1);
  a[k << 1 | 1].sum = a[k].lazy * (a[k << 1 | 1].r - a[k << 1 | 1].l + 1);
  a[k << 1].minl = a[k << 1 | 1].lazy = a[k].lazy;
  a[k].lazy = 0;
}
void changeS(int k, int l, int r, long long y) {
  if (a[k].l >= l && a[k].r <= r) {
    a[k].sum = y * (a[k].r - a[k].l + 1);
    a[k].lazy = y;
    return;
  }
  pushdown(k);
  int mid = (a[k].l + a[k].r) >> 1;
  if (l <= mid) changeS(k << 1, l, r, y);
  if (r > mid) changeS(k << 1 | 1, l, r, y);
  update(k);
}
int query(int k, int l, int r, long long& y) {
  if (a[k].minl > y) return 0;
  if (a[k].l == a[k].r) {
    if (a[k].sum <= y) {
      y -= a[k].sum;
      return 1;
    } else
      return 0;
  }
  if (a[k].l >= l && a[k].r <= r) {
    if (a[k].sum <= y) {
      y -= a[k].sum;
      return a[k].r - a[k].l + 1;
    }
  }
  pushdown(k);
  int mid = (a[k].l + a[k].r) >> 1;
  int x = 0;
  if (l <= mid) x += query(k << 1, l, r, y);
  if (r > mid) x += query(k << 1 | 1, l, r, y);
  return x;
}
long long find(int k, int x) {
  if (a[k].l == a[k].r) {
    return a[k].sum;
  }
  pushdown(k);
  int mid = (a[k].l + a[k].r) >> 1;
  if (x <= mid)
    return find(k << 1, x);
  else
    return find(k << 1 | 1, x);
}
int ask1(int x, long long y) {
  int l = 1, r = x, mid = (l + r) >> 1;
  int ans = -1;
  while (l <= r) {
    if (find(1, mid) < y) {
      ans = mid;
      r = mid - 1;
    } else
      l = mid + 1;
    mid = (l + r) >> 1;
  }
  return ans;
}
int main(void) {
  int n, i, q, op, x;
  long long y;
  scanf("%d%d", &n, &q);
  for (i = 1; i <= n; i++) scanf("%d", &b[i]);
  build(1, 1, n);
  for (i = 1; i <= q; i++) {
    scanf("%d%d%lld", &op, &x, &y);
    if (op == 1) {
      if (find(1, x) < y) {
        int l = ask1(x, y);
        changeS(1, l, x, y);
      }
    } else {
      int ans = query(1, x, n, y);
      printf("%d\n", ans);
    }
  }
  return 0;
}
