#include <bits/stdc++.h>
const int N = 100005, mo = 1000000007;
using namespace std;
int n, a[N], d[N], bit[N], tot_l[N], tot_r[N], rt[N];
int find(int ave) {
  int l = 1, r = d[0];
  for (; l <= r;) {
    int mid = (l + r) / 2;
    if (ave == d[mid]) return mid;
    if (ave < d[mid])
      r = mid - 1;
    else
      l = mid + 1;
  }
  return 0;
}
void put(int x, int y) {
  for (; x <= d[0]; x += x & (-x)) {
    bit[x] += y;
  }
}
int get(int x) {
  int ret = 0;
  for (; x; x -= x & (-x)) {
    ret += bit[x];
  }
  return ret;
}
void pre() {
  d[0] = 0;
  for (int i = 1; i <= n; ++i) {
    d[++d[0]] = a[i];
  }
  sort(d + 1, d + d[0] + 1);
  d[0] = unique(d + 1, d + d[0] + 1) - (d + 1);
  for (int i = 1; i <= n; ++i) {
    a[i] = find(a[i]);
  }
  for (int i = 1; i <= d[0]; ++i) bit[i] = 0;
  for (int i = 1; i <= n; ++i) {
    tot_l[i] = get(a[i]);
    put(a[i], 1);
  }
  for (int i = 1; i <= n; ++i) put(a[i], -1);
  for (int i = n; i; --i) {
    tot_r[i] = get(a[i]);
    put(a[i], 1);
  }
  for (int i = 1; i <= n; ++i) put(a[i], -1);
}
int cnt, m, ans;
struct node {
  int sum[2][2];
  int tag, l, r;
} tr[N * 30];
void upd(int &x, int y) { x = (x + y) % mo; }
void psd(int p) {
  int l = tr[p].l, r = tr[p].r;
  if (tr[p].tag) {
    if (l) {
      tr[l].tag = (tr[l].tag + tr[p].tag) % mo;
      tr[l].sum[0][1] =
          (tr[l].sum[0][1] + (long long)tr[l].sum[0][0] * tr[p].tag % mo) % mo;
      tr[l].sum[1][1] =
          (tr[l].sum[1][1] + (long long)tr[l].sum[1][0] * tr[p].tag % mo) % mo;
    }
    if (r) {
      tr[r].tag = (tr[r].tag + tr[p].tag) % mo;
      tr[r].sum[0][1] =
          (tr[r].sum[0][1] + (long long)tr[r].sum[0][0] * tr[p].tag % mo) % mo;
      tr[r].sum[1][1] =
          (tr[r].sum[1][1] + (long long)tr[r].sum[1][0] * tr[p].tag % mo) % mo;
    }
    tr[p].tag = 0;
  }
}
void upd(int p) {
  int l = tr[p].l, r = tr[p].r;
  for (int i = 0; i <= 1; ++i)
    for (int j = 0; j <= 1; ++j) {
      tr[p].sum[i][j] = 0;
      if (l) upd(tr[p].sum[i][j], tr[l].sum[i][j]);
      if (r) upd(tr[p].sum[i][j], tr[r].sum[i][j]);
    }
}
void build(int &p, int l, int r, int pos) {
  if (!p) {
    p = ++cnt;
    for (int i = 0; i <= 1; ++i)
      for (int j = 0; j <= 1; ++j) {
        tr[p].sum[i][j] = 0;
      }
    tr[p].tag = 0;
  }
  if (l == r) {
    return;
  }
  int mid = (l + r) / 2;
  if (pos <= mid)
    build(tr[p].l, l, mid, pos);
  else
    build(tr[p].r, mid + 1, r, pos);
}
void modify(int p, int l, int r, int lx, int rx, int ave) {
  if (!p || lx > rx) return;
  if (l == lx && r == rx) {
    upd(tr[p].tag, ave);
    tr[p].sum[0][1] =
        (tr[p].sum[0][1] + (long long)tr[p].sum[0][0] * ave % mo) % mo;
    tr[p].sum[1][1] =
        (tr[p].sum[1][1] + (long long)tr[p].sum[1][0] * ave % mo) % mo;
    return;
  }
  int mid = (l + r) / 2;
  psd(p);
  if (rx <= mid)
    modify(tr[p].l, l, mid, lx, rx, ave);
  else if (lx > mid)
    modify(tr[p].r, mid + 1, r, lx, rx, ave);
  else
    modify(tr[p].l, l, mid, lx, mid, ave),
        modify(tr[p].r, mid + 1, r, mid + 1, rx, ave);
  upd(p);
}
void queryl(int p, int l, int r, int lx, int rx, int &resx, int &resy) {
  if (!p || lx > rx) {
    resx = resy = 0;
    return;
  }
  if (l == lx && r == rx) {
    resx = tr[p].sum[0][0];
    resy = tr[p].sum[0][1];
    return;
  }
  int mid = (l + r) / 2;
  psd(p);
  if (rx <= mid)
    queryl(tr[p].l, l, mid, lx, rx, resx, resy);
  else if (lx > mid)
    queryl(tr[p].r, mid + 1, r, lx, rx, resx, resy);
  else {
    int res2x, res2y;
    queryl(tr[p].l, l, mid, lx, mid, resx, resy);
    queryl(tr[p].r, mid + 1, r, mid + 1, rx, res2x, res2y);
    upd(resx, res2x), upd(resy, res2y);
  }
}
void queryr(int p, int l, int r, int lx, int rx, int &resx, int &resy) {
  if (!p || lx > rx) {
    resx = resy = 0;
    return;
  }
  if (l == lx && r == rx) {
    resx = tr[p].sum[1][0];
    resy = tr[p].sum[1][1];
    return;
  }
  int mid = (l + r) / 2;
  psd(p);
  if (rx <= mid)
    queryr(tr[p].l, l, mid, lx, rx, resx, resy);
  else if (lx > mid)
    queryr(tr[p].r, mid + 1, r, lx, rx, resx, resy);
  else {
    int res2x, res2y;
    queryr(tr[p].l, l, mid, lx, mid, resx, resy);
    queryr(tr[p].r, mid + 1, r, mid + 1, rx, res2x, res2y);
    upd(resx, res2x), upd(resy, res2y);
  }
}
int getid(int p, int l, int r, int pos) {
  if (l == r) return tr[p].tag;
  int mid = (l + r) / 2;
  psd(p);
  if (pos <= mid) return getid(tr[p].l, l, mid, pos);
  return getid(tr[p].r, mid + 1, r, pos);
}
void change(int p, int l, int r, int pos, int op) {
  if (l == r) {
    if (op) {
      tr[p].sum[0][0] = tot_l[pos];
      tr[p].sum[0][1] = (long long)tot_l[pos] * tr[p].tag % mo;
      tr[p].sum[1][0] = tot_r[pos];
      tr[p].sum[1][1] = (long long)tot_r[pos] * tr[p].tag % mo;
    } else {
      for (int i = 0; i <= 1; ++i)
        for (int j = 0; j <= 1; ++j) {
          tr[p].sum[i][j] = 0;
        }
    }
    return;
  }
  int mid = (l + r) / 2;
  psd(p);
  if (pos <= mid)
    change(tr[p].l, l, mid, pos, op);
  else
    change(tr[p].r, mid + 1, r, pos, op);
  upd(p);
}
void ins(int x) {
  int resx, resy, tmp1, tmp2;
  modify(rt[a[x]], 1, n, x + 1, n, 1);
  queryl(rt[a[x]], 1, n, 1, x - 1, resx, resy);
  tmp1 = resx;
  int id = getid(rt[a[x]], 1, n, x);
  int res = (long long)tot_r[x] * resx % mo * (id - 1) % mo -
            (long long)tot_r[x] * resy % mo;
  res %= mo;
  upd(ans, res);
  queryr(rt[a[x]], 1, n, x + 1, n, resx, resy);
  tmp2 = resx;
  res = -(long long)tot_l[x] * resx % mo * (id + 1) % mo +
        (long long)tot_l[x] * resy % mo;
  res %= mo;
  upd(ans, res);
  upd(ans, (long long)tmp1 * tmp2 % mo);
  change(rt[a[x]], 1, n, x, 1);
}
void del(int x) {
  change(rt[a[x]], 1, n, x, 0);
  int resx, resy, id = getid(rt[a[x]], 1, n, x), tmp1, tmp2;
  queryl(rt[a[x]], 1, n, 1, x - 1, resx, resy);
  tmp1 = resx;
  int res = (long long)tot_r[x] * resx % mo * (id - 1) % mo -
            (long long)tot_r[x] * resy % mo;
  res %= mo;
  upd(ans, -res);
  queryr(rt[a[x]], 1, n, x + 1, n, resx, resy);
  tmp2 = resx;
  res = -(long long)tot_l[x] * resx % mo * (id + 1) % mo +
        (long long)tot_l[x] * resy % mo;
  res %= mo;
  upd(ans, -res);
  upd(ans, -(long long)tmp1 * tmp2 % mo);
  modify(rt[a[x]], 1, n, x + 1, n, -1);
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  pre();
  cnt = 0;
  for (int i = 1; i <= n; ++i) {
    build(rt[a[i]], 1, n, i);
  }
  for (int i = 1; i <= n; ++i) {
    ins(i);
  }
  scanf("%d", &m);
  int x, y;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &x, &y);
    if (x == 1)
      del(y);
    else
      ins(y);
    printf("%d\n", (ans + mo) % mo);
  }
  return 0;
}
