#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char ch = getchar();
  int nega = 1;
  while (!isdigit(ch)) {
    if (ch == '-') nega = -1;
    ch = getchar();
  }
  int ans = 0;
  while (isdigit(ch)) {
    ans = ans * 10 + ch - 48;
    ch = getchar();
  }
  if (nega == -1) return -ans;
  return ans;
}
int add(int x, int y) {
  return x + y >= 1000000007 ? x + y - 1000000007 : x + y;
}
int sub(int x, int y) { return x - y < 0 ? x - y + 1000000007 : x - y; }
int mul(int x, int y) { return 1LL * x * y % 1000000007; }
int qpow(int x, int y) {
  int ans = 1;
  while (y) {
    if (y & 1) ans = mul(ans, x);
    x = mul(x, x);
    y >>= 1;
  }
  return ans;
}
int inv(int x) { return qpow(x, 1000000007 - 2); }
int pw[600005], ipw[600005], i2 = 500000004;
int p[600005], pos[600005], val[600005], n, Q, cnt;
pair<int, int> v[600005];
struct Node {
  int pw, l, r, val;
};
Node merge(Node x, Node y) {
  Node ans;
  ans.pw = mul(x.pw, y.pw);
  ans.l = add(x.l, mul(x.pw, y.l));
  ans.r = add(y.r, mul(y.pw, x.r));
  ans.val = add(add(mul(x.pw, y.val), mul(x.val, y.pw)), mul(x.l, y.r));
  return ans;
}
Node t[600005 * 4];
int d[600005];
void build(int u, int l, int r) {
  if (l == r) {
    t[u].pw = 1;
    return;
  }
  int mid = (l + r) / 2;
  build((u << 1), l, mid);
  build((u << 1 | 1), mid + 1, r);
  t[u] = merge(t[(u << 1)], t[(u << 1 | 1)]);
}
void update(int u, int l, int r, int p, int opt) {
  if (l == r) {
    if (opt == 1)
      t[u] = (Node){2, d[l], d[l], 0};
    else
      t[u] = (Node){1, 0, 0, 0};
    return;
  }
  int mid = (l + r) / 2;
  if (p <= mid)
    update((u << 1), l, mid, p, opt);
  else
    update((u << 1 | 1), mid + 1, r, p, opt);
  t[u] = merge(t[(u << 1)], t[(u << 1 | 1)]);
}
void print() { printf("%d\n", mul(t[1].val, ipw[n])); }
signed main() {
  pw[0] = 1;
  for (int i = 1; i < 600005; i++) pw[i] = add(pw[i - 1], pw[i - 1]);
  ipw[0] = 1;
  for (int i = 1; i < 600005; i++) ipw[i] = mul(ipw[i - 1], i2);
  cin >> n;
  for (int i = 1; i <= n; i++) p[i] = read(), v[++cnt] = make_pair(p[i], i);
  cin >> Q;
  for (int i = 1; i <= Q; i++) {
    pos[i] = read(), val[i] = read();
    v[++cnt] = make_pair(val[i], i + n);
  }
  sort(v + 1, v + cnt + 1);
  for (int i = 1; i <= n; i++)
    p[i] = lower_bound(v + 1, v + cnt + 1, make_pair(p[i], i)) - v;
  for (int i = 1; i <= Q; i++)
    val[i] = lower_bound(v + 1, v + cnt + 1, make_pair(val[i], i + n)) - v;
  for (int i = 1; i <= cnt; i++) d[i] = v[i].first;
  build(1, 1, cnt);
  for (int i = 1; i <= n; i++) update(1, 1, cnt, p[i], 1);
  print();
  for (int i = 1; i <= Q; i++) {
    update(1, 1, cnt, p[pos[i]], 0);
    p[pos[i]] = val[i];
    update(1, 1, cnt, p[pos[i]], 1);
    print();
  }
  return 0;
}
