#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 5;
const long long mod = 1e9 + 7;
long long add(long long a, long long b) {
  return (a + b >= mod ? a + b - mod : a + b);
}
long long sub(long long a, long long b) {
  return (a - b < 0 ? a - b + mod : a - b);
}
long long mul(long long a, long long b) { return (a * b) % mod; }
long long power(long long x, long long y) {
  if (y == 1) {
    return x;
  } else {
    long long tmp = power(x, y / 2);
    if (y & 1) {
      return mul(mul(tmp, tmp), x);
    } else {
      return mul(tmp, tmp);
    }
  }
}
long long revMod(long long x) { return power(x, mod - 2); }
long long n, q, a[N], inDex[N];
long long pw[N], revPw[N], used[N];
pair<long long, long long> queRy[N], b[N];
long long st[2][4 * N], lz[2][4 * N];
long long fen[N];
void updBit(int id, int x) {
  for (int i = id; i <= n + q; i += (i & -i)) {
    fen[i] += x;
  }
}
int getBit(int id) {
  int sum = 0;
  for (int i = id; i >= 1; i -= (i & -i)) {
    sum += fen[i];
  }
  return sum;
}
void build(int id, int l, int r, int tp) {
  lz[tp][id] = 1;
  if (l == r) {
    if (tp == 0) {
      st[tp][id] = mul(used[l], mul(b[l].first, pw[getBit(l - 1)]));
    } else {
      st[tp][id] = mul(used[l], mul(b[l].first, pw[getBit(n + q) - getBit(l)]));
    }
    return;
  }
  int mid = (l + r) >> 1;
  build(id << 1, l, mid, tp);
  build(id << 1 | 1, mid + 1, r, tp);
  st[tp][id] = add(st[tp][id << 1], st[tp][id << 1 | 1]);
}
void pushDown(int id, int l, int r, int tp) {
  if (lz[tp][id] != 1) {
    st[tp][id] = mul(st[tp][id], lz[tp][id]);
    if (l < r) {
      lz[tp][id << 1] = mul(lz[tp][id << 1], lz[tp][id]);
      lz[tp][id << 1 | 1] = mul(lz[tp][id << 1 | 1], lz[tp][id]);
    }
    lz[tp][id] = 1;
  }
}
void update(int id, int l, int r, int i, int j, long long x, int tp) {
  pushDown(id, l, r, tp);
  if (l > j || r < i || i > j) {
    return;
  }
  if (l >= i && r <= j) {
    lz[tp][id] = mul(lz[tp][id], x);
    pushDown(id, l, r, tp);
    return;
  }
  int mid = (l + r) >> 1;
  update(id << 1, l, mid, i, j, x, tp);
  update(id << 1 | 1, mid + 1, r, i, j, x, tp);
  st[tp][id] = add(st[tp][id << 1], st[tp][id << 1 | 1]);
}
void updPos(int id, int l, int r, int i, long long x, int tp) {
  pushDown(id, l, r, tp);
  if (l > i || r < i) {
    return;
  }
  if (l == r) {
    st[tp][id] = x;
    return;
  }
  int mid = (l + r) >> 1;
  updPos(id << 1, l, mid, i, x, tp);
  updPos(id << 1 | 1, mid + 1, r, i, x, tp);
  st[tp][id] = add(st[tp][id << 1], st[tp][id << 1 | 1]);
}
long long get(int id, int l, int r, int i, int j, int tp) {
  pushDown(id, l, r, tp);
  if (l > j || r < i || i > j) {
    return 0;
  }
  if (l >= i && r <= j) {
    return st[tp][id];
  }
  int mid = (l + r) >> 1;
  return add(get(id << 1, l, mid, i, j, tp),
             get(id << 1 | 1, mid + 1, r, i, j, tp));
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    b[i] = {a[i], i};
  }
  cin >> q;
  for (int i = 1; i <= q; i++) {
    cin >> queRy[i].first >> queRy[i].second;
    b[n + i] = {queRy[i].second, n + i};
  }
  pw[0] = 1;
  revPw[0] = revMod(pw[0]);
  for (int i = 1; i <= n + q; i++) {
    pw[i] = mul(pw[i - 1], 2);
    revPw[i] = revMod(pw[i]);
  }
  sort(b + 1, b + n + q + 1);
  for (int i = 1; i <= n + q; i++) {
    inDex[b[i].second] = i;
    if (b[i].second <= n) {
      updBit(i, 1);
      used[i] = 1;
    }
  }
  build(1, 1, n + q, 0);
  build(1, 1, n + q, 1);
  long long ans = 0;
  for (int i = 1; i <= n + q; i++) {
    long long tmp =
        mul(pw[getBit(n + q) - getBit(i)], mul(used[i], b[i].first));
    ans = add(ans, mul(tmp, get(1, 1, n + q, 1, i - 1, 0)));
  }
  cout << mul(ans, revPw[n]) << "\n";
  for (int i = 1; i <= q; i++) {
    long long pos = queRy[i].first, val = queRy[i].second;
    int idx = inDex[pos];
    long long tmp1 = get(1, 1, n + q, 1, idx - 1, 0);
    long long tmp2 = get(1, 1, n + q, idx + 1, n + q, 1);
    long long tmp = mul(pw[getBit(n + q) - getBit(idx)], b[idx].first);
    ans = sub(ans, mul(tmp, tmp1));
    tmp = mul(pw[getBit(idx - 1)], b[idx].first);
    ans = sub(ans, mul(tmp, tmp2));
    ans = sub(ans, mul(tmp1, tmp2));
    ans = mul(ans, revPw[1]);
    ans = add(ans, mul(tmp1, tmp2));
    update(1, 1, n + q, idx + 1, n + q, revPw[1], 0);
    update(1, 1, n + q, 1, idx - 1, revPw[1], 1);
    updPos(1, 1, n + q, idx, 0, 0);
    updPos(1, 1, n + q, idx, 0, 1);
    used[idx] = 0;
    updBit(idx, -1);
    idx = inDex[n + i];
    tmp1 = get(1, 1, n + q, 1, idx - 1, 0);
    tmp2 = get(1, 1, n + q, idx + 1, n + q, 1);
    ans = sub(ans, mul(tmp1, tmp2));
    ans = mul(ans, pw[1]);
    ans = add(ans, mul(tmp1, tmp2));
    tmp = mul(pw[getBit(n + q) - getBit(idx)], b[idx].first);
    ans = add(ans, mul(tmp, tmp1));
    tmp = mul(pw[getBit(idx - 1)], b[idx].first);
    ans = add(ans, mul(tmp, tmp2));
    update(1, 1, n + q, idx + 1, n + q, pw[1], 0);
    update(1, 1, n + q, 1, idx - 1, pw[1], 1);
    updPos(1, 1, n + q, idx, mul(b[idx].first, pw[getBit(idx - 1)]), 0);
    updPos(1, 1, n + q, idx, mul(b[idx].first, pw[getBit(n + q) - getBit(idx)]),
           1);
    used[idx] = 1;
    updBit(idx, 1);
    inDex[pos] = idx;
    cout << mul(ans, revPw[n]) << "\n";
  }
}
