#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  x = 0;
  int p = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') p = -p;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    x = (x << 1) + (x << 3) + (ch - '0'), ch = getchar();
  x = x * p;
}
const int mod = 1e9 + 7;
const int inv = (mod + 1) >> 1;
const int maxn = 600005;
int n, p[maxn], tt, Q, g[maxn], tong[maxn << 2], now[maxn], ans, siz[maxn << 3],
    lazy[maxn << 3][2], tree[maxn << 3][2], po[maxn], tot;
struct question {
  int opt, x, now;
} q[maxn << 1];
struct node {
  int id, x;
  bool operator<(const node &b) const { return x < b.x; }
} s[maxn];
int qpow(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1LL * res * x % mod;
    x = 1LL * x * x % mod;
    y >>= 1;
  }
  return res;
}
inline void add(int &x, int y) {
  x += y;
  if (x >= mod) x -= mod;
}
inline void change(int rt, int x, int y) {
  lazy[rt][x] = 1LL * lazy[rt][x] * y % mod;
  tree[rt][x] = 1LL * tree[rt][x] * y % mod;
}
inline void pushup(int rt) {
  tree[rt][0] = tree[rt << 1][0] + tree[rt << 1 | 1][0];
  if (tree[rt][0] >= mod) tree[rt][0] -= mod;
  tree[rt][1] = tree[rt << 1][1] + tree[rt << 1 | 1][1];
  if (tree[rt][1] >= mod) tree[rt][1] -= mod;
  siz[rt] = siz[rt << 1] + siz[rt << 1 | 1];
}
void pushdown(int rt) {
  for (int i = 0; i < 2; ++i) {
    if (lazy[rt][i] != 1) {
      change(rt << 1, i, lazy[rt][i]);
      change(rt << 1 | 1, i, lazy[rt][i]);
      lazy[rt][i] = 1;
    }
  }
}
int getsiz(int L, int R, int l, int r, int rt) {
  if (L > R) return 0;
  if (L <= l && R >= r) {
    return siz[rt];
  }
  pushdown(rt);
  int mid = (l + r) >> 1;
  int res = 0;
  if (L <= mid) res += getsiz(L, R, l, mid, rt << 1);
  if (R > mid) res += getsiz(L, R, mid + 1, r, rt << 1 | 1);
  return res;
}
void change(int L, int R, int opt, int x, int l, int r, int rt) {
  if (L > R) return;
  if (L <= l && R >= r) {
    change(rt, opt, x);
    return;
  }
  pushdown(rt);
  int mid = (l + r) >> 1;
  if (L <= mid) change(L, R, opt, x, l, mid, rt << 1);
  if (R > mid) change(L, R, opt, x, mid + 1, r, rt << 1 | 1);
  pushup(rt);
}
int query(int L, int R, int opt, int l, int r, int rt) {
  if (L > R) return 0;
  if (L <= l && R >= r) {
    return tree[rt][opt];
  }
  pushdown(rt);
  int res = 0;
  int mid = (l + r) >> 1;
  if (L <= mid) add(res, query(L, R, opt, l, mid, rt << 1));
  if (R > mid) add(res, query(L, R, opt, mid + 1, r, rt << 1 | 1));
  return res;
}
void update(int to, int x, int l, int r, int rt) {
  if (l == r) {
    int a = getsiz(1, to - 1, 1, tot, 1);
    int b = getsiz(to + 1, tot, 1, tot, 1);
    int c = query(1, to - 1, 0, 1, tot, 1);
    int d = query(to + 1, tot, 1, 1, tot, 1);
    add(ans, mod - 1LL * c * tree[rt][1] % mod);
    add(ans, mod - 1LL * d * tree[rt][0] % mod);
    tree[rt][0] = 1LL * po[a] * x % mod;
    tree[rt][1] = 1LL * po[b] * x % mod;
    add(ans, 1LL * c * tree[rt][1] % mod);
    add(ans, 1LL * d * tree[rt][0] % mod);
    siz[rt] ^= 1;
    return;
  }
  pushdown(rt);
  int mid = (l + r) >> 1;
  if (to <= mid)
    update(to, x, l, mid, rt << 1);
  else
    update(to, x, mid + 1, r, rt << 1 | 1);
  pushup(rt);
}
void insert(int x, int y) {
  int w = ans;
  add(w, mod - 1LL * query(1, x - 1, 0, 1, tot, 1) *
                   query(x + 1, tot, 1, 1, tot, 1) % mod);
  change(1, x - 1, 1, 2, 1, tot, 1);
  change(x + 1, tot, 0, 2, 1, tot, 1);
  update(x, y, 1, tot, 1);
  add(ans, w);
}
void delate(int x) {
  update(x, 0, 1, tot, 1);
  add(ans, mod - 1LL * query(1, x - 1, 0, 1, tot, 1) *
                     query(x + 1, tot, 1, 1, tot, 1) % mod);
  ans = 1LL * ans * inv % mod;
  add(ans, 1LL * query(1, x - 1, 0, 1, tot, 1) *
               query(x + 1, tot, 1, 1, tot, 1) % mod);
  change(1, x - 1, 1, inv, 1, tot, 1);
  change(x + 1, tot, 0, inv, 1, tot, 1);
}
signed main() {
  tot = 0;
  tt = 0;
  read(n);
  po[0] = 1;
  for (int i = 1; i <= n; ++i) po[i] = 1LL * po[i - 1] * 2 % mod;
  memset(lazy, 1, sizeof(lazy));
  for (int i = 1; i <= n; ++i) {
    read(p[i]);
    g[i] = p[i];
    now[i] = i;
    q[++tt] = (question){i, p[i], i};
    s[++tot] = (node){i, p[i]};
  }
  read(Q);
  q[++tt] = (question){0, 0, 0};
  for (int i = 1; i <= Q; ++i) {
    int x, y;
    read(x);
    read(y);
    q[++tt] = (question){-x, p[x], now[x]};
    p[x] = y;
    now[x] = i + n;
    s[++tot] = (node){i + n, p[x]};
    q[++tt] = (question){x, p[x], now[x]};
    q[++tt] = (question){0, 0, 0};
  }
  sort(s + 1, s + tot + 1);
  for (int i = 1; i <= tot; ++i) {
    tong[s[i].id] = i;
  }
  ans = 0;
  int in = qpow(po[n], mod - 2);
  for (int i = 1; i <= tt; ++i) {
    if (q[i].opt > 0) {
      insert(tong[q[i].now], q[i].x);
    } else if (q[i].opt < 0) {
      delate(tong[q[i].now]);
    } else {
      printf("%d\n", 1LL * ans * in % mod);
    }
  }
}
