#include <bits/stdc++.h>
using namespace std;
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline int qread() {
  register char c =
      (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
           ? EOF
           : *p1++);
  register int x = 0, f = 1;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
             ? EOF
             : *p1++);
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - 48;
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2)
             ? EOF
             : *p1++);
  }
  return x * f;
}
inline int Abs(const int& x) { return (x > 0 ? x : -x); }
inline int Max(const int& x, const int& y) { return (x > y ? x : y); }
inline int Min(const int& x, const int& y) { return (x < y ? x : y); }
const long long mod = 1000000007;
long long inv2[300005];
struct Node {
  long long ans, lsum, rsum;
  int len;
  Node *l, *r;
};
Node nd[2400005];
int top;
struct Segtree {
  Node* _root;
  inline void Modify(Node*& p, int pl, int pr, int idx, int v) {
    if (!p) p = &nd[++top];
    if (pl == pr) {
      p->ans = 0;
      if (v > 0)
        p->len++;
      else
        p->len--;
      p->lsum = (p->lsum + inv2[1] * v % mod) % mod;
      p->rsum = (p->rsum + inv2[1] * v % mod) % mod;
      return;
    }
    int mid = pl + pr >> 1;
    if (idx <= mid)
      Modify(p->l, pl, mid, idx, v);
    else
      Modify(p->r, mid + 1, pr, idx, v);
    p->len = (p->l ? p->l->len : 0) + (p->r ? p->r->len : 0);
    p->lsum = ((p->l ? p->l->lsum : 0) +
               (p->r ? p->r->lsum : 0) * inv2[(p->l ? p->l->len : 0)] % mod) %
              mod;
    p->rsum = ((p->l ? p->l->rsum : 0) * inv2[(p->r ? p->r->len : 0)] % mod +
               (p->r ? p->r->rsum : 0)) %
              mod;
    p->ans = (((p->l ? p->l->ans : 0) + (p->r ? p->r->ans : 0)) % mod +
              (p->l ? p->l->rsum : 0) * (p->r ? p->r->lsum : 0) % mod) %
             mod;
  }
};
Segtree sgt;
int n, q, a[300005], idx[300005], val[300005], b[600005];
map<int, int> cnt;
inline void Read() {
  n = qread();
  inv2[0] = 1;
  inv2[1] = (mod + 1) / 2;
  for (int i = 2; i <= n; i++) inv2[i] = inv2[i - 1] * inv2[1] % mod;
  for (int i = 1; i <= n; i++) b[i] = a[i] = qread();
  q = qread();
  for (int i = 1; i <= q; i++) {
    idx[i] = qread();
    val[i] = b[n + i] = qread();
  }
}
inline void Prefix() {
  sort(b + 1, b + n + q + 1);
  for (int i = 1; i <= n; i++) {
    cnt[a[i]]++;
    a[i] = lower_bound(b + 1, b + n + q + 1, a[i]) - b + cnt[a[i]] - 1;
  }
  for (int i = 1; i <= q; i++) {
    cnt[val[i]]++;
    val[i] = lower_bound(b + 1, b + n + q + 1, val[i]) - b + cnt[val[i]] - 1;
  }
}
inline void Solve() {
  for (int i = 1; i <= n; i++) {
    sgt.Modify(sgt._root, 1, n + q, a[i], b[a[i]]);
  }
  printf("%lld\n", sgt._root->ans);
  for (int i = 1; i <= q; i++) {
    sgt.Modify(sgt._root, 1, n + q, a[idx[i]], -b[a[idx[i]]]);
    sgt.Modify(sgt._root, 1, n + q, a[idx[i]] = val[i], b[val[i]]);
    printf("%lld\n", sgt._root->ans);
  }
}
int main() {
  Read();
  Prefix();
  Solve();
  return 0;
}
