#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void setmin(T &x, T y) {
  if (y < x) x = y;
}
template <typename T>
inline void setmax(T &x, T y) {
  if (y > x) x = y;
}
template <typename T>
inline T gcd(T a, T b) {
  while (b) swap(a %= b, b);
  return a;
}
const int MAX = (1 << 14);
const int INF = 1e9 + 7;
const long long BIG_INF = 1e18 + 5;
int POCZ[MAX], KON[MAX];
long long MOD[MAX];
long long n, k, q;
pair<vector<int>, vector<int> > tree[2 * MAX];
vector<pair<int, int> > tab;
void dodaj(int pocz, int kon, int value) {
  pocz += MAX, kon += MAX;
  tree[pocz].first.push_back(value);
  if (pocz != kon) {
    tree[kon].first.push_back(value);
  }
  while (pocz >> 1 != kon >> 1) {
    if (!(pocz & 1)) {
      tree[pocz + 1].first.push_back(value);
    }
    if (kon & 1) {
      tree[kon - 1].first.push_back(value);
    }
    pocz >>= 1;
    kon >>= 1;
  }
}
vector<int> knapsack(vector<int> base, vector<int> &nowe) {
  for (auto u : nowe) {
    int koszt = tab[u].first;
    int waga = tab[u].second;
    for (int i = int((base).size()) - 1; i >= waga; i--) {
      base[i] = max(base[i], base[i - waga] + koszt);
    }
  }
  return base;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  MOD[0] = 1;
  for (int(i) = (1); (i) < (MAX); (i)++) {
    MOD[i] = (MOD[i - 1] * (long long)(1e7 + 19)) % INF;
  }
  fill(KON, KON + MAX, MAX - 1);
  fill(POCZ, POCZ + MAX, MAX);
  for (int(i) = (0); (i) < (n); (i)++) {
    int a, b;
    cin >> a >> b;
    tab.push_back({a, b});
    POCZ[i] = 0;
  }
  cin >> q;
  int ile_q1 = 0;
  int ile_q3 = 0;
  vector<int> zapytania;
  int pom = 1;
  bool czy_zmiana = 1;
  for (int(i) = (0); (i) < (q); (i)++) {
    int znak;
    cin >> znak;
    if (znak == 1) {
      czy_zmiana = 1;
      int a, b;
      cin >> a >> b;
      POCZ[n + ile_q1] = ile_q3;
      tab.push_back({a, b});
      ile_q1++;
    } else if (znak == 2) {
      czy_zmiana = 1;
      int a;
      cin >> a;
      a--;
      KON[a] = ile_q3 - 1;
    } else {
      if (czy_zmiana) {
        ile_q3++;
        zapytania.push_back(pom);
        pom = 1;
        czy_zmiana = 0;
      } else {
        pom++;
      }
    }
  }
  zapytania.push_back(pom);
  for (int i = 0; i < n + ile_q1; i++) {
    if (POCZ[i] > KON[i]) {
      continue;
    }
    dodaj(POCZ[i], KON[i], i);
  }
  vector<int> temp;
  temp.resize(k + 1);
  tree[1].second = temp;
  for (int(i) = (2); (i) < (2 * MAX); (i)++) {
    tree[i].second = knapsack(tree[i / 2].second, tree[i].first);
  }
  for (int(i) = (MAX); (i) < (MAX + ile_q3); (i)++) {
    long long odp = 0;
    for (int j = 1; j <= k; j++) {
      odp = (odp + tree[i].second[j] * MOD[j - 1]) % INF;
    }
    cout << odp << '\n';
    for (int j = 1; j < zapytania[i - MAX + 1]; j++) cout << odp << '\n';
  }
}
