#include <bits/stdc++.h>
using namespace std;
const int N = 6e5 + 7, M = 1e9 + 7, i2 = (M + 1) / 2;
int inv2[N], p2[N];
int con[N];
inline int add(int x, int y) { return x + y >= M ? x + y - M : x + y; }
inline int sub(int x, int y) { return x - y < 0 ? x - y + M : x - y; }
struct FastMod {
  unsigned long long b, m;
  FastMod(unsigned long long b) : b(b), m(-1ULL / b) {}
  unsigned long long reduce(unsigned long long a) {
    return a - (unsigned long long)((__uint128_t(m) * a) >> 64) * b;
  }
} F(M);
inline int mul(int x, int y) {
  assert(0 <= x && 0 <= y);
  int ans = F.reduce(1LL * x * y);
  if (ans >= M) ans -= M;
  return ans;
}
void pre() {
  inv2[0] = p2[0] = 1;
  for (int i = 1; i < N; i++) {
    inv2[i] = (1LL * inv2[i - 1] * i2) % M;
    p2[i] = (p2[i - 1] * 2) % M;
  }
  con[0] = 0;
  for (int i = 1; i < N; i++) con[i] = (1LL * i * i2 - 1 + inv2[i]) % M;
}
struct Node {
  int ans, lsum, rsum, cnt;
};
Node leaf(int cnt, int val) {
  Node ans;
  ans.cnt = cnt;
  ans.ans = mul(con[cnt], mul(val, val));
  ans.lsum = ans.rsum = mul(val, sub(1, inv2[cnt]));
  return ans;
}
Node tr[4 * N];
int val[N], cnt[N];
Node combine(const Node& left, const Node& right) {
  Node ans;
  ans.cnt = left.cnt + right.cnt;
  ans.ans = add(add(left.ans, right.ans), mul(left.rsum, right.lsum));
  ans.lsum = add(left.lsum, mul(right.lsum, inv2[left.cnt]));
  ans.rsum = add(right.rsum, mul(left.rsum, inv2[right.cnt]));
  return ans;
}
void build(int u, int st, int en) {
  if (st == en) {
    tr[u] = leaf(cnt[st], val[st]);
  } else {
    int mid = (st + en) / 2;
    build(2 * u, st, mid);
    build(2 * u + 1, mid + 1, en);
    tr[u] = combine(tr[2 * u], tr[2 * u + 1]);
  }
}
void update(int u, int st, int en, int idx) {
  if (st == en)
    tr[u] = leaf(cnt[st], val[st]);
  else {
    int mid = (st + en) / 2;
    if (idx <= mid)
      update(2 * u, st, mid, idx);
    else
      update(2 * u + 1, mid + 1, en, idx);
    tr[u] = combine(tr[2 * u], tr[2 * u + 1]);
  }
}
Node query(int u, int st, int en, int l, int r) {
  if (r < st || en < l)
    return {0, 0, 0, 0};
  else if (l <= st && en <= r)
    return tr[u];
  else {
    int mid = (st + en) / 2;
    return combine(query(2 * u, st, mid, l, r),
                   query(2 * u + 1, mid + 1, en, l, r));
  }
}
int p[N], idx[N], x[N];
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  pre();
  int n;
  cin >> n;
  map<int, int> mp;
  for (int i = 1; i <= n; i++) cin >> p[i], mp[p[i]] = 0;
  int q;
  cin >> q;
  for (int i = 1; i <= q; i++) {
    cin >> idx[i] >> x[i];
    mp[x[i]] = 0;
  }
  int sz = 0;
  for (auto& pr : mp) {
    pr.second = ++sz;
    val[sz] = pr.first;
  }
  for (int i = 1; i <= n; i++) {
    p[i] = mp[p[i]];
    cnt[p[i]]++;
  }
  build(1, 1, sz);
  cout << query(1, 1, sz, 1, sz).ans << "\n";
  for (int i = 1; i <= q; i++) {
    x[i] = mp[x[i]];
    cnt[p[idx[i]]]--;
    update(1, 1, sz, p[idx[i]]);
    p[idx[i]] = x[i];
    cnt[p[idx[i]]]++;
    update(1, 1, sz, p[idx[i]]);
    cout << query(1, 1, sz, 1, sz).ans << "\n";
  }
}
