#include <bits/stdc++.h>
using namespace std;
long long max(long long a, long long b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}
long long min(long long a, long long b) {
  if (a < b) {
    return a;
  } else {
    return b;
  }
}
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.emplace_back(x);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << ", ";
  err(++it, args...);
}
template <typename T>
struct number_iterator : std::iterator<random_access_iterator_tag, T> {
  T v;
  number_iterator(T _v) : v(_v) {}
  operator T&() { return v; }
  T operator*() const { return v; }
};
template <typename T>
struct number_range {
  T b, e;
  number_range(T b, T e) : b(b), e(e) {}
  number_iterator<T> begin() { return b; }
  number_iterator<T> end() { return e; }
};
template <typename T>
number_range<T> range(T e) {
  return number_range<T>(1, e + 1);
}
template <typename T>
number_range<T> range(T b, T e) {
  return number_range<T>(b, e + 1);
}
int l[500001], r[500001], h, cnt, v[500001], w[500001];
int n, lb[500001], rb[500001], q;
int k;
long long res[500001];
vector<int> Q, a[500001][2];
void build(int u, int lb, int rb) {
  if (lb == rb) return;
  build(l[u] = ++h, lb, (lb + rb) / 2);
  build(r[u] = ++h, (lb + rb) / 2 + 1, rb);
}
void update(int u, int lb, int rb, int lq, int rq, int v1, int v2) {
  if (lb >= lq && rb <= rq) {
    a[u][0].push_back(v1);
    a[u][1].push_back(v2);
    return;
  }
  int mid = (lb + rb) / 2;
  if (mid >= lq) update(l[u], lb, mid, lq, rq, v1, v2);
  if (mid < rq) update(r[u], mid + 1, rb, lq, rq, v1, v2);
}
void solve(int u, int lb, int rb, vector<long long> dp) {
  for (int i = 0; i < a[u][0].size(); i++) {
    int v = a[u][0][i], w = a[u][1][i];
    for (int j = k; j >= w; j--) dp[j] = max(dp[j], dp[j - w] + v);
  }
  if (lb == rb) {
    res[lb] = 0;
    for (int j = k; j >= 1; j--) {
      res[lb] = (res[lb] * (long long)(10000000 + 19) + dp[j]) %
                (long long)(1000000000 + 7);
    }
  } else {
    solve(l[u], lb, (lb + rb) / 2, dp);
    solve(r[u], (lb + rb) / 2 + 1, rb, dp);
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (auto i : range(n)) {
    scanf("%d%d", &v[i], &w[i]);
    lb[i] = 1;
  }
  cnt = n;
  scanf("%d", &q);
  for (auto i : range(n)) rb[i] = q;
  for (auto i : range(q)) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      cnt++;
      scanf("%d%d", &v[cnt], &w[cnt]);
      lb[cnt] = i;
      rb[cnt] = q;
    } else if (op == 2) {
      int t;
      scanf("%d", &t);
      rb[t] = i;
    } else {
      Q.push_back(i);
    }
  }
  build(h = 0, 1, q);
  for (auto i : range(cnt)) update(0, 1, q, lb[i], rb[i], v[i], w[i]);
  vector<long long> dp;
  for (auto i : range(0, k)) dp.push_back(0);
  solve(0, 1, q, dp);
  for (auto i : Q) printf("%I64d\n", res[i]);
  return 0;
}
