#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
struct Node {
  int ij, lp, ijk, klp, ijklp, active;
} nil;
unordered_map<int, int> Norm;
vector<int> values[maxn];
vector<Node> aint[maxn];
pair<int, int> normal[maxn];
int n, nr, v[maxn], ij[maxn], lp[maxn], pos[maxn], aib[maxn];
inline Node join(Node left, Node right) {
  Node ans;
  ans.active = left.active + right.active;
  ans.ij = left.ij + right.ij;
  ans.lp = left.lp + right.lp;
  ans.ijk = (0LL + left.ijk + right.ijk + 1LL * left.ij * right.active) % mod;
  ans.klp = (0LL + left.klp + right.klp + 1LL * left.active * right.lp) % mod;
  ans.ijklp = (0LL + left.ijklp + right.ijklp) % mod;
  ans.ijklp = (0LL + ans.ijklp + 1LL * left.ijk * right.lp) % mod;
  ans.ijklp = (0LL + ans.ijklp + 1LL * left.ij * right.klp) % mod;
  return ans;
}
void dfs(int idx, int node, int left, int right) {
  if (left == right) {
    aint[idx][node] = {
        ij[values[idx][left]], lp[values[idx][left]], 0, 0, 0, 1};
    return;
  }
  int middle = (left + right) / 2;
  dfs(idx, node * 2, left, middle);
  dfs(idx, node * 2 + 1, middle + 1, right);
  aint[idx][node] = join(aint[idx][node * 2], aint[idx][node * 2 + 1]);
}
void update(int idx, int node, int left, int right, int p, Node val) {
  if (left == right) {
    aint[idx][node] = val;
    return;
  }
  int middle = (left + right) / 2;
  if (p <= middle)
    update(idx, node * 2, left, middle, p, val);
  else
    update(idx, node * 2 + 1, middle + 1, right, p, val);
  aint[idx][node] = join(aint[idx][node * 2], aint[idx][node * 2 + 1]);
}
int query_aib(int pos) {
  int nr = 0;
  for (; pos > 0; pos -= (pos & (-pos))) nr += aib[pos];
  return nr;
}
void update_aib(int pos) {
  for (; pos <= n; pos += (pos & (-pos))) aib[pos]++;
}
int main() {
  int x, q, t, idx;
  int answer = 0;
  cin >> n;
  for (int i = 1; i <= n; i++) values[i].push_back(0);
  for (int i = 1; i <= n; i++) {
    cin >> v[i];
    normal[i] = {v[i], i};
  }
  sort(normal + 1, normal + n + 1);
  for (int i = 1; i <= n; i++) {
    if (normal[i].first != normal[i - 1].first) nr++;
    Norm[normal[i].first] = nr;
    values[nr].push_back(normal[i].second);
    pos[normal[i].second] = values[nr].size() - 1;
  }
  for (int i = 1; i <= n; i++) {
    x = Norm[v[i]];
    ij[i] = query_aib(x);
    update_aib(x);
  }
  memset(aib, 0, sizeof aib);
  for (int i = n; i >= 1; i--) {
    x = Norm[v[i]];
    lp[i] = query_aib(x);
    update_aib(x);
  }
  Node aux = {0, 0, 0, 0, 0, 0};
  nil = aux;
  for (int i = 1; i <= nr; i++) {
    for (int j = 1; j < 4 * values[i].size(); j++) aint[i].push_back(aux);
    dfs(i, 1, 1, values[i].size() - 1);
    answer = (answer + aint[i][1].ijklp) % mod;
  }
  cin >> q;
  while (q--) {
    cin >> t >> x;
    if (t == 1) {
      idx = Norm[v[x]];
      answer -= aint[idx][1].ijklp;
      if (answer < 0) answer += mod;
      update(idx, 1, 1, values[idx].size() - 1, pos[x], nil);
      answer = (answer + aint[idx][1].ijklp) % mod;
      cout << answer << '\n';
    } else {
      idx = Norm[v[x]];
      answer -= aint[idx][1].ijklp;
      if (answer < 0) answer += mod;
      aux = {ij[x], lp[x], 0, 0, 0, 1};
      update(idx, 1, 1, values[idx].size() - 1, pos[x], aux);
      answer = (answer + aint[idx][1].ijklp) % mod;
      cout << answer << '\n';
    }
  }
  return 0;
}
