#include <bits/stdc++.h>
using namespace std;
template <typename T>
void maxtt(T &t1, T t2) {
  t1 = max(t1, t2);
}
template <typename T>
void mintt(T &t1, T t2) {
  t1 = min(t1, t2);
}
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
const long long MOD2 = (long long)1000000007 * (long long)1000000007;
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "YES" : "NO");
  exit(0);
}
void addmod(int &x, int y, int mod = 1000000007) {
  x += y;
  if (x >= mod) x -= mod;
  if (x < 0) x += mod;
  assert(x >= 0 && x < mod);
}
void et(int x = -1) {
  printf("%d\n", x);
  exit(0);
}
long long fastPow(long long x, long long y, int mod = 1000000007) {
  long long ans = 1;
  while (y > 0) {
    if (y & 1) ans = (x * ans) % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return ans;
}
long long gcd1(long long x, long long y) { return y ? gcd1(y, x % y) : x; }
int p2[300135 * 2], np2[300135 * 2];
int p[300135], pos[300135 * 2];
pair<int, int> lst[300135 * 2];
void init(int n) {
  p2[0] = 1;
  np2[0] = 1;
  for (int(i) = 1; (i) <= (int)(n); (i)++) {
    p2[i] = p2[i - 1];
    addmod(p2[i], p2[i - 1]);
    np2[i] = fastPow(p2[i], 1000000007 - 2);
  }
}
struct nd {
  int val, lv, rv, ct;
  nd() { val = lv = rv = ct = 0; }
  friend nd operator+(const nd &x, const nd &y) {
    nd res = nd();
    addmod(res.val, x.val);
    addmod(res.val, y.val);
    addmod(res.val,
           (long long)x.lv * y.rv % 1000000007 * np2[x.ct] % 1000000007);
    res.lv = x.lv;
    addmod(res.lv, (long long)y.lv * p2[x.ct] % 1000000007);
    res.rv = x.rv;
    addmod(res.rv, (long long)y.rv * np2[x.ct] % 1000000007);
    res.ct = x.ct + y.ct;
    return res;
  }
  void clr() { val = lv = rv = ct = 0; }
  void sett(int id) {
    clr();
    lv = lst[id].first;
    rv = (long long)lst[id].first * np2[1] % 1000000007;
    ct = 1;
  }
  void ppt() { printf("%d\n", val); }
} T[300135 * 8];
void Up(int rt, int l, int r) { T[rt] = T[(rt << 1)] + T[(rt << 1 | 1)]; }
void build(int rt, int l, int r) {
  if (l == r) {
    if (lst[r].second <= n) {
      T[rt].sett(r);
    }
    return;
  }
  int mid = (l + r) / 2;
  build((rt << 1), l, mid);
  build((rt << 1 | 1), mid + 1, r);
  Up(rt, l, r);
}
void upt(int rt, int l, int r, int P, bool fg) {
  if (l == r) {
    if (fg) {
      T[rt].clr();
    } else
      T[rt].sett(r);
    return;
  }
  int mid = (l + r) / 2;
  if (P <= mid)
    upt((rt << 1), l, mid, P, fg);
  else
    upt((rt << 1 | 1), mid + 1, r, P, fg);
  Up(rt, l, r);
}
int qx[300135], qv[300135];
void fmain(int tid) {
  scanf("%d", &n);
  init(n + m);
  for (int(i) = 1; (i) <= (int)(n); (i)++) scanf("%d", p + i);
  for (int(i) = 1; (i) <= (int)(n); (i)++) lst[i] = {p[i], i};
  scanf("%d", &m);
  for (int(i) = 1; (i) <= (int)(m); (i)++) {
    scanf("%d%d", qx + i, qv + i);
    lst[n + i] = {qv[i], n + i};
  }
  sort(lst + 1, lst + 1 + n + m);
  for (int(i) = 1; (i) <= (int)(n + m); (i)++) pos[lst[i].second] = i;
  build(1, 1, m + n);
  T[1].ppt();
  for (int(i) = 1; (i) <= (int)(m); (i)++) {
    int w = pos[qx[i]];
    upt(1, 1, m + n, w, 1);
    pos[qx[i]] = pos[n + i];
    upt(1, 1, m + n, pos[qx[i]], 0);
    T[1].ppt();
  }
}
int main() {
  int t = 1;
  for (int(i) = 1; (i) <= (int)(t); (i)++) {
    fmain(i);
  }
  return 0;
}
