#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 10;
const int mod = 1e9 + 7;
int qpow(int a, int b, int mo) {
  int res = 1;
  while (b) {
    if (b & 1) res = 1ll * res * a % mo;
    a = 1ll * a * a % mo;
    b >>= 1;
  }
  return res;
}
struct seg {
  int lval, rval, val;
  int co;
} tree[N << 2];
int pow2[N], inv2[N];
void pushup(int pos) {
  tree[pos].val = (tree[pos << 1].val + tree[pos << 1 | 1].val) % mod +
                  1ll * tree[pos << 1].lval * tree[pos << 1 | 1].rval % mod *
                      inv2[tree[pos << 1].co] % mod;
  tree[pos].val %= mod;
  tree[pos].lval = tree[pos << 1].lval + 1ll * tree[pos << 1 | 1].lval *
                                             pow2[tree[pos << 1].co] % mod;
  tree[pos].lval %= mod;
  tree[pos].rval = tree[pos << 1].rval + 1ll * tree[pos << 1 | 1].rval *
                                             inv2[tree[pos << 1].co] % mod;
  tree[pos].rval %= mod;
  tree[pos].co = tree[pos << 1].co + tree[pos << 1 | 1].co;
}
void update(int pos, int x, int w, int l, int r) {
  if (l == r) {
    if (w < 0) {
      tree[pos].val = 0;
      tree[pos].co = 0;
      tree[pos].rval = 0;
      tree[pos].lval = 0;
    } else {
      tree[pos].val = 0;
      tree[pos].co = 1;
      tree[pos].rval = 1ll * w * inv2[1] % mod;
      tree[pos].lval = w;
    }
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    update(pos << 1, x, w, l, mid);
  else
    update(pos << 1 | 1, x, w, mid + 1, r);
  pushup(pos);
}
struct node {
  int v, id, pos;
} a[N], ask[N];
bool cmp(node d, node e) { return d.v < e.v; }
int n, p[N];
int res, q;
int main() {
  int in2 = qpow(2, mod - 2, mod);
  pow2[0] = 1;
  inv2[0] = 1;
  for (int i = 1; i < N; i++) {
    pow2[i] = 1ll * pow2[i - 1] * 2 % mod;
    inv2[i] = 1ll * inv2[i - 1] * in2 % mod;
  }
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i].v), a[i].id = i;
  scanf("%d", &q);
  for (int i = 1; i <= q; i++) {
    scanf("%d%d", &a[i + n].pos, &a[i + n].v), a[i + n].id = i + n;
    ask[i].pos = a[i + n].pos;
    ask[i].v = a[i + n].v;
  }
  sort(a + 1, a + 1 + n + q, cmp);
  for (int i = 1; i <= n + q; i++) {
    if (a[i].id <= n) update(1, i, a[i].v, 1, n + q);
    p[a[i].id] = i;
  }
  printf("%d\n", tree[1].val);
  for (int i = 1; i <= q; i++) {
    int k1 = p[ask[i].pos];
    int k2 = p[i + n];
    update(1, k1, -a[k1].v, 1, q + n);
    update(1, p[i + n], a[k2].v, 1, n + q);
    p[ask[i].pos] = k2;
    printf("%d\n", tree[1].val);
  }
}
