#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10, MN = 1e5 + 10, MOD = 1e9 + 7;
int arr[MN], uni[MN], un, n, pref[MN], suf[MN], rt[MN], ind[MN], Now;
int ans = 0, L[MN << 2], R[MN << 2], fen[MN];
vector<int> pl[MN];
void ok(int &x) {
  if (x < 0) x += MOD;
  if (x >= MOD) x -= MOD;
}
struct node {
  int sm1[2], sm2[2], num;
} seg[MN << 2];
void add_fen(int p, int val) {
  for (p++; p < MN; p += p & -p) fen[p] += val;
}
int get_fen(int p) {
  int ret = 0;
  for (; p; p -= p & -p) ret += fen[p];
  return ret;
}
int build(int b, int e) {
  int v = Now++;
  seg[v] = {0, 0, 0, 0, 0};
  if (e - b == 1) return v;
  int mid = b + e >> 1;
  L[v] = build(b, mid);
  R[v] = build(mid, e);
  return v;
}
void init() {
  cin >> n;
  for (int i = 0; i < n; ++i) cin >> arr[i], uni[un++] = arr[i];
  sort(uni, uni + un);
  un = unique(uni, uni + un) - uni;
  for (int i = 0; i < n; ++i) {
    arr[i] = lower_bound(uni, uni + un, arr[i]) - uni;
    ind[i] = ((int)(pl[arr[i]]).size());
    pl[arr[i]].push_back(i);
  }
  for (int i = 0; i < un; ++i) {
    for (auto x : pl[i]) add_fen(x, 1);
    for (auto x : pl[i])
      pref[x] = get_fen(x), suf[x] = get_fen(n) - get_fen(x + 1);
    rt[i] = build(0, ((int)(pl[i]).size()));
  }
}
node merge(node A, node B) {
  node ret;
  ret.num = A.num + B.num;
  ret.sm1[0] = A.sm1[0] + B.sm1[0], ok(ret.sm1[0]);
  ret.sm1[1] = A.sm1[1] + B.sm1[1], ok(ret.sm1[1]);
  ret.sm2[0] = 1ll * A.num * B.sm1[0] % MOD + B.sm2[0], ok(ret.sm2[0]);
  ret.sm2[0] += A.sm2[0], ok(ret.sm2[0]);
  ret.sm2[1] = 1ll * A.num * B.sm1[1] % MOD + B.sm2[1], ok(ret.sm2[1]);
  ret.sm2[1] += A.sm2[1], ok(ret.sm2[1]);
  return ret;
}
node get(int id, int b, int e, int l, int r) {
  if (r <= b || e <= l) return {0, 0, 0, 0, 0};
  if (l <= b && e <= r) return seg[id];
  int mid = b + e >> 1;
  return merge(get(L[id], b, mid, l, r), get(R[id], mid, e, l, r));
}
void upd(int id, int b, int e, int p, int val, int x) {
  if (e - b == 1) {
    seg[id].sm1[0] += val * pref[x], ok(seg[id].sm1[0]);
    seg[id].sm1[1] += val * suf[x], ok(seg[id].sm1[1]);
    seg[id].sm2[0] = seg[id].sm2[1] = 0;
    seg[id].num += val;
    return;
  }
  int mid = b + e >> 1;
  if (p < mid)
    upd(L[id], b, mid, p, val, x);
  else
    upd(R[id], mid, e, p, val, x);
  seg[id] = merge(seg[L[id]], seg[R[id]]);
}
void UPD(int x, int val) {
  int sz = ((int)(pl[arr[x]]).size()), id = rt[arr[x]];
  node A = get(id, 0, sz, 0, ind[x]), B = get(id, 0, sz, ind[x] + 1, sz);
  int D = 1ll * val * A.sm1[0] * B.sm1[1] % MOD;
  ok(D);
  D += 1ll * val * (1ll * A.sm1[0] * (A.num - 1) % MOD - A.sm2[0] + MOD) % MOD *
       suf[x] % MOD,
      ok(D);
  D += 1ll * val * pref[x] * B.sm2[1] % MOD, ok(D);
  ans += D;
  ok(ans);
  upd(id, 0, sz, ind[x], val, x);
}
int main() {
  ios_base ::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  init();
  memset(fen, 0, sizeof fen);
  for (int i = 0; i < n; ++i) UPD(i, 1);
  int q;
  cin >> q;
  while (q--) {
    int tp, x;
    cin >> tp >> x;
    if (tp == 1)
      UPD(x - 1, -1);
    else
      UPD(x - 1, 1);
    cout << ans << '\n';
  }
  return 0;
}
