2 8
2 15 400
1 13 100
3 26
3 27
3 28
3 29
3 30
3 31
3 32
3 33
 3 8
2 15 400
1 1 200
1 13 100
3 26
3 27
3 28
3 29
3 30
3 31
3 32
3 33

400
400
500
500
800
800
800
800
 600
600
600
700
800
1000
1000
1000

#include <bits/stdc++.h>
using namespace std;
struct SegmentTree {
  vector<long long> ST;
  long long N;
  SegmentTree(vector<long long> &V) {
    N = V.size();
    ST.resize(N << 2);
    build(1, 0, N - 1, V);
  }
  void build(long long n, long long i, long long j, vector<long long> &V) {
    if (i == j) {
      ST[n] = V[i];
      return;
    }
    build(n << 1, i, (i + j) / 2, V);
    build(n << 1 | 1, (i + j) / 2 + 1, j, V);
    ST[n] = ST[n << 1] + ST[n << 1 | 1];
  }
  long long query(long long l, long long r) { return query(1, 0, N - 1, l, r); }
  long long query(long long n, long long i, long long j, long long l,
                  long long r) {
    if (j < l || r < i) return 0;
    if (i >= l && j <= r) return ST[n];
    return query(n << 1, i, (i + j) / 2, l, r) +
           query(n << 1 | 1, (i + j) / 2 + 1, j, l, r);
  }
  void update(long long i, long long val) {
    return update(1, 0, N - 1, i, val);
  }
  void update(long long n, long long i, long long j, long long l,
              long long val) {
    if (j < l || l < i) return;
    if (i <= l && l <= j) ST[n] += val;
    if (i == j) return;
    update(n << 1, i, (i + j) / 2, l, val);
    update(n << 1 | 1, (i + j) / 2 + 1, j, l, val);
    ST[n] = ST[n << 1] + ST[n << 1 | 1];
  }
};
int main() {
  long long n, q;
  cin >> n >> q;
  vector<pair<pair<int, int>, pair<int, int>>> d(n);
  for (long long i = 0; i < n; i++) {
    cin >> d[i].second.first >> d[i].first.second >> d[i].first.first;
    d[i].second.second = i;
  }
  sort(d.begin(), d.end());
  vector<long long> map(n), w(n), v(n), a(n), wt(n), vt(n);
  for (long long i = 0; i < n; i++) {
    w[i] = d[i].first.second;
    v[i] = d[i].first.first;
    a[i] = d[i].second.first;
    map[d[i].second.second] = i;
    wt[i] = w[i] * a[i];
    vt[i] = v[i] * a[i];
  }
  w.push_back(0);
  a.push_back(0);
  SegmentTree STwt(wt), STvt(vt);
  while (q--) {
    long long t;
    cin >> t;
    if (t == 1) {
      long long k, i;
      cin >> k >> i;
      i--;
      i = map[i];
      STwt.update(i, w[i] * k);
      STvt.update(i, v[i] * k);
      a[i] += k;
    }
    if (t == 2) {
      long long k, i;
      cin >> k >> i;
      i--;
      i = map[i];
      STwt.update(i, -w[i] * k);
      STvt.update(i, -v[i] * k);
      a[i] -= k;
    }
    if (t == 3) {
      long long c;
      cin >> c;
      long long l = 0, r = n - 1;
      while (l != r) {
        long long mid = (l + r) / 2;
        if (STwt.query(mid, n) <= c)
          r = mid;
        else
          l = mid + 1;
      }
      long long resp = STvt.query(l, n);
      c -= STwt.query(l, n);
      if (l > 0) resp += v[l - 1] * (c / w[l - 1]);
      cout << resp << endl;
    }
  }
}
