#include <bits/stdc++.h>
using namespace std;
template <class c>
struct rge {
  c b, e;
};
template <class c>
rge<c> range(c i, c j) {
  return rge<c>{i, j};
}
template <class c>
auto dud(c* x) -> decltype(cerr << *x, 0);
template <class c>
char dud(...);
struct debug {
  template <class c>
  debug& operator<<(const c&) {
    return *this;
  }
};
using ll = long long;
using ld = long double;
constexpr int nax = 200 * 1000 + 105;
constexpr int infty = 1000 * 1000 * 1000 + 5;
constexpr int mod = 1000 * 1000 * 1000 + 7;
ll Dodaj(ll a, ll b) {
  a += b;
  if (a >= mod) a -= mod;
  return a;
}
ll Odejmij(ll a, ll b) {
  a -= b;
  if (a < 0) a += mod;
  return a;
}
ll Mnoz(ll a, ll b) { return (a * b) % mod; }
ll Pot(ll x, int n) {
  ll wyn = 1;
  while (n) {
    if (n % 2 == 1) wyn = Mnoz(wyn, x);
    x = Mnoz(x, x);
    n /= 2;
  }
  return x;
}
ll Odw(ll x) { return Pot(x, mod - 2); }
ll sil[nax];
ll odwrot_sil[nax];
ll Dwumian(int n, int k) {
  assert(n < nax);
  if (k > n) return 0ll;
  if (k < 0) return 0ll;
  return Mnoz(sil[n], Mnoz(odwrot_sil[n - k], odwrot_sil[k]));
}
int n, m;
int a[nax];
vector<int> num;
int L[nax];
int R[nax];
struct War {
  int ile;
  ll cale;
  ll lewo[2], prawo[2];
  void Zero() {
    ile = 0;
    cale = 0;
    lewo[0] = lewo[1] = 0;
    prawo[0] = prawo[1] = 0;
  }
  void Init(int poz) {
    ile = 1;
    cale = 0;
    lewo[0] = L[poz];
    prawo[0] = R[poz];
    lewo[1] = prawo[1] = 0;
  }
  void Zlacz(const War& l, const War& r) {
    ile = l.ile + r.ile;
    cale = Dodaj(Dodaj(l.cale, r.cale), Dodaj(Mnoz(l.lewo[0], r.prawo[1]),
                                              Mnoz(l.lewo[1], r.prawo[0])));
    lewo[0] = Dodaj(l.lewo[0], r.lewo[0]);
    prawo[0] = Dodaj(l.prawo[0], r.prawo[0]);
    lewo[1] = Dodaj(Dodaj(l.lewo[1], r.lewo[1]), Mnoz(l.lewo[0], r.ile));
    prawo[1] = Dodaj(Dodaj(l.prawo[1], r.prawo[1]), Mnoz(l.ile, r.prawo[0]));
  }
};
debug& operator<<(debug& deb, const War& w) {
  return deb << "War{ ile = " << w.ile << ", cale = " << w.cale << ", lewo = {"
             << w.lewo[0] << ", " << w.lewo[1] << "}, prawo = {" << w.prawo[0]
             << ", " << w.prawo[1] << "} }";
}
struct Drzewo {
  int n, n2;
  vector<int> pozy;
  vector<War> wary;
  int pos(int x) const {
    return lower_bound(pozy.begin(), pozy.end(), x) - pozy.begin();
  }
  void Init() {
    n = (int)pozy.size();
    n2 = 1;
    while (n2 < n) n2 *= 2;
    wary.resize(n2 * 2);
    for (int i = 0; i < n; i++) {
      wary[n2 + i].Init(pozy[i]);
    }
    for (int i = n; i < n2; i++) {
      wary[n2 + i].Zero();
    }
    for (int i = n2 - 1; i > 0; i--) {
      wary[i].Zlacz(wary[i * 2], wary[i * 2 + 1]);
    }
  }
  ll Wynik() const { return wary[1].cale; }
  void Zapytka(int t, int x) {
    int w = pos(x) + n2;
    if (t == 1) {
      wary[w].Zero();
    } else if (t == 2) {
      wary[w].Init(x);
    } else {
      assert(false);
    }
    w /= 2;
    while (w) {
      wary[w].Zlacz(wary[w * 2], wary[w * 2 + 1]);
      w /= 2;
    }
  }
};
Drzewo drzewa[nax];
void zapytki() {
  int q;
  scanf("%d", &q);
  ll wynik = 0;
  for (int i = 0; i < m; i++) {
    const ll wyn = drzewa[i].Wynik();
    debug() << " ["
            << "i"
               ": "
            << (i) << "] "
            << " ["
            << "wyn"
               ": "
            << (wyn) << "] ";
    wynik = Dodaj(wynik, wyn);
  }
  while (q--) {
    int t, x;
    scanf("%d%d", &t, &x);
    x--;
    wynik = Odejmij(wynik, drzewa[a[x]].Wynik());
    drzewa[a[x]].Zapytka(t, x);
    wynik = Dodaj(wynik, drzewa[a[x]].Wynik());
    printf("%lld\n", wynik);
  }
}
int n2;
int drz_licz[nax * 4];
void DLDodaj(int x) {
  x += n2;
  while (x) {
    drz_licz[x]++;
    x /= 2;
  }
}
int DLSum(int a, int b) {
  if (a > b) return 0;
  a += n2;
  b += n2;
  int wynik = drz_licz[a];
  if (a != b) wynik += drz_licz[b];
  while ((a / 2) != (b / 2)) {
    if (a % 2 == 0) wynik += drz_licz[a + 1];
    if (b % 2 == 1) wynik += drz_licz[b - 1];
    a /= 2;
    b /= 2;
  }
  return wynik;
}
int main() {
  sil[0] = 1;
  odwrot_sil[0] = 1;
  for (int i = 1; i < nax; i++) {
    sil[i] = Mnoz(sil[i - 1], i);
    odwrot_sil[i] = Odw(sil[i]);
  }
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    num.push_back(a[i]);
  }
  sort(num.begin(), num.end());
  num.resize(unique(num.begin(), num.end()) - num.begin());
  for (int i = 0; i < n; i++) {
    a[i] = lower_bound(num.begin(), num.end(), a[i]) - num.begin();
  }
  m = (int)num.size();
  n2 = 1;
  while (n2 < n) n2 *= 2;
  for (int i = 0; i < n; i++) {
    L[i] = DLSum(0, a[i]);
    DLDodaj(a[i]);
  }
  for (int i = 0; i <= n2 * 2; i++) {
    drz_licz[i] = 0;
  }
  for (int i = n - 1; i >= 0; i--) {
    R[i] = DLSum(0, a[i]);
    DLDodaj(a[i]);
  }
  debug() << " ["
          << "range(L, L + n)"
             ": "
          << (range(L, L + n)) << "] ";
  debug() << " ["
          << "range(R, R + n)"
             ": "
          << (range(R, R + n)) << "] ";
  for (int i = 0; i < n; i++) {
    drzewa[a[i]].pozy.push_back(i);
  }
  for (int i = 0; i < m; i++) {
    drzewa[i].Init();
  }
  zapytki();
  return 0;
}
