#include <bits/stdc++.h>
using namespace std;
namespace io {
const int l = 1 << 20;
char buf[l], *s, *t, c;
inline void gc() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, l, stdin);
    c = s == t ? EOF : *s++;
  } else
    c = *s++;
}
template <class IT>
inline void gi(IT &x) {
  x = 0;
  gc();
  while (c < '0' || c > '9') gc();
  while ('0' <= c && c <= '9') {
    x = (x << 1) + (x << 3) + (c ^ 48);
    gc();
  }
}
char buf0[20];
int a;
template <class IT>
inline void pi(IT x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  do buf0[++a] = x % 10 + 48;
  while (x /= 10);
  while (a) putchar(buf0[a--]);
  putchar('\n');
}
};  // namespace io
using io::gi;
using io::pi;
template <class IT>
inline void cmax(IT &a, IT b) {
  if (a < b) a = b;
}
template <class IT>
inline void cmin(IT &a, IT b) {
  if (b < a) a = b;
}
const long long p = 1000000007ll, inv = 500000004ll;
const int N = 600005, nn = 300000, M = N >> 1;
struct node {
  int n;
  long long c, a, b, ta, tb;
  inline node() : ta(1ll), tb(1ll) {}
} tre[N << 2];
inline void pt(int o, long long A, long long B) {
  tre[o].a = tre[o].a * A % p;
  tre[o].b = tre[o].b * B % p;
  tre[o].c = tre[o].c * (A * B % p) % p;
  tre[o].ta = tre[o].ta * A % p;
  tre[o].tb = tre[o].tb * B % p;
}
inline void pd(int o) {
  if (tre[o].ta != 1ll || tre[o].tb != 1ll) {
    pt(o << 1, tre[o].ta, tre[o].tb);
    pt(o << 1 | 1, tre[o].ta, tre[o].tb);
    tre[o].ta = tre[o].tb = 1ll;
  }
}
inline void pu(int o) {
  tre[o].a = (tre[o << 1].a + tre[o << 1 | 1].a) % p;
  tre[o].b = (tre[o << 1].b + tre[o << 1 | 1].b) % p;
  tre[o].c =
      (tre[o << 1].c + tre[o << 1 | 1].c + tre[o << 1].a * tre[o << 1 | 1].b) %
      p;
}
inline void upd(int o, int l, int r, int b, long long A, long long B) {
  if (b <= l) {
    pt(o, A, B);
    return;
  }
  pd(o);
  if (b <= ((l + r) >> 1)) upd(o << 1, l, ((l + r) >> 1), b, A, B);
  upd(o << 1 | 1, ((l + r) >> 1) + 1, r, b, A, B);
  pu(o);
}
inline void add(int o, int l, int r, int x, long long A, long long B) {
  ++tre[o].n;
  if (l == r) {
    tre[o].a = A;
    tre[o].b = B;
    return;
  }
  pd(o);
  if (x <= ((l + r) >> 1))
    add(o << 1, l, ((l + r) >> 1), x, A, B);
  else
    add(o << 1 | 1, ((l + r) >> 1) + 1, r, x, A, B);
  pu(o);
}
inline void del(int o, int l, int r, int x) {
  --tre[o].n;
  if (l == r) {
    tre[o].a = tre[o].b = 0ll;
    return;
  }
  pd(o);
  if (x <= ((l + r) >> 1))
    del(o << 1, l, ((l + r) >> 1), x);
  else
    del(o << 1 | 1, ((l + r) >> 1) + 1, r, x);
  pu(o);
}
inline int que(int o, int l, int r, int x) {
  if (l == r) return tre[o].n;
  pd(o);
  if (x <= ((l + r) >> 1))
    return que(o << 1, l, ((l + r) >> 1), x);
  else
    return tre[o << 1].n + que(o << 1 | 1, ((l + r) >> 1) + 1, r, x);
}
pair<int, pair<int, int> > x[N];
pair<int, pair<int, int> > id[N];
pair<int, int> tmp[M];
long long e2[M], ei[M];
int main() {
  int n, i, q, m, a, b, c;
  long long v;
  e2[0] = 1ll;
  for (i = (1); i <= (nn); ++i) e2[i] = e2[i - 1] * 2ll % p;
  ei[0] = 1ll;
  for (i = (1); i <= (nn); ++i) ei[i] = ei[i - 1] * inv % p;
  scanf("%d", &n);
  for (i = (1); i <= (n); ++i) {
    scanf("%d", &x[i].first);
    x[i].second = make_pair(i, i);
  }
  scanf("%d", &q);
  m = n + q;
  for (i = (1); i <= (q); ++i) {
    scanf("%d%d", &x[i + n].second.second, &x[i + n].first);
    x[i + n].second.first = i + n;
  }
  sort(x + 1, x + m + 1);
  for (i = (1); i <= (m); ++i)
    id[x[i].second.first] =
        make_pair(x[i].second.second, make_pair(i, x[i].first));
  for (i = (1); i <= (m); ++i) {
    a = id[i].first;
    if (tmp[a].first) {
      b = tmp[a].first;
      v = tmp[a].second;
      del(1, 1, m, b);
      if (b != m) upd(1, 1, m, b + 1, inv, 2ll);
    }
    b = id[i].second.first;
    v = id[i].second.second;
    c = que(1, 1, m, b);
    add(1, 1, m, b, v * e2[c] % p, v * ei[c] % p);
    if (b != m) upd(1, 1, m, b + 1, 2ll, inv);
    tmp[a] = make_pair(b, v);
    if (i >= n) printf("%lld\n", tre[1].c * inv % p);
  }
  return 0;
}
