#include <bits/stdc++.h>
using namespace std;
const int LEN = 100000;
struct fastio {
  int it, len;
  char s[LEN + 5];
  fastio() { it = len = 0; }
  char get() {
    if (it < len) return s[it++];
    it = 0, len = fread(s, 1, LEN, stdin);
    return len ? s[it++] : EOF;
  }
  bool notend() {
    char c;
    for (c = get(); c == ' ' || c == '\n'; c = get())
      ;
    if (it) it--;
    return c != EOF;
  }
  void put(char c) {
    if (it == LEN) fwrite(s, 1, LEN, stdout), it = 0;
    s[it++] = c;
  }
  void flush() { fwrite(s, 1, it, stdout); }
} buff, bufo;
inline int getint() {
  char c;
  int res = 0, sig = 1;
  for (c = buff.get(); c < '0' || c > '9'; c = buff.get())
    if (c == '-') sig = -1;
  for (; c >= '0' && c <= '9'; c = buff.get()) res = res * 10 + (c - '0');
  return sig * res;
}
inline long long getll() {
  char c;
  long long res = 0, sig = 1;
  for (c = buff.get(); c < '0' || c > '9'; c = buff.get())
    if (c == '-') sig = -1;
  for (; c >= '0' && c <= '9'; c = buff.get()) res = res * 10 + (c - '0');
  return sig * res;
}
inline void putint(int x, char suf) {
  if (!x)
    bufo.put('0');
  else {
    if (x < 0) bufo.put('-'), x = -x;
    int k = 0;
    char s[15];
    while (x) {
      s[++k] = x % 10 + '0';
      x /= 10;
    }
    for (; k; k--) bufo.put(s[k]);
  }
  bufo.put(suf);
}
inline void putll(long long x, char suf) {
  if (!x)
    bufo.put('0');
  else {
    if (x < 0) bufo.put('-'), x = -x;
    int k = 0;
    char s[25];
    while (x) {
      s[++k] = x % 10 + '0';
      x /= 10;
    }
    for (; k; k--) bufo.put(s[k]);
  }
  bufo.put(suf);
}
inline char get_char() {
  char c;
  for (c = buff.get(); c == ' ' || c == '\n'; c = buff.get())
    ;
  return c;
}
const long long inv2 = 500000004;
const long long mod = 1000000007;
int len;
struct BIT {
  int bit[300005 + 300005];
  void add(int pos, int x) {
    for (int i = pos; i <= len; i += i & -i) bit[i] += x;
  }
  int qsum(int pos) {
    int res = 0;
    for (int i = pos; i; i -= i & -i) res += bit[i];
    return res;
  }
} S;
long long ori[300005 + 300005], pow2[300005], powInv2[300005];
namespace sgt {
long long sumx[(300005 + 300005) << 2], sumy[(300005 + 300005) << 2],
    mul2[(300005 + 300005) << 2];
inline long long calcPow2(long long x) {
  if (x >= 0) return pow2[x];
  return powInv2[-x];
}
void up(int id) {
  sumx[id] = (sumx[id << 1] + sumx[id << 1 | 1]) % mod;
  (sumx[id] *= calcPow2(mul2[id])) %= mod;
  sumy[id] = (sumy[id << 1] + sumy[id << 1 | 1]) % mod;
  (sumy[id] *= calcPow2(-mul2[id])) %= mod;
}
void down(int id) {
  if (mul2[id]) {
    mul2[id << 1] += mul2[id];
    (sumx[id << 1] *= calcPow2(mul2[id])) %= mod;
    (sumy[id << 1] *= calcPow2(-mul2[id])) %= mod;
    mul2[id << 1 | 1] += mul2[id];
    (sumx[id << 1 | 1] *= calcPow2(mul2[id])) %= mod;
    (sumy[id << 1 | 1] *= calcPow2(-mul2[id])) %= mod;
    mul2[id] = 0;
  }
}
void add(int id, int l, int r, int pos, long long x, long long y) {
  if (l == r) {
    (sumx[id] += x) %= mod;
    (sumy[id] += y) %= mod;
  } else {
    down(id);
    int mid = (l + r) >> 1;
    if (pos <= mid)
      add(id << 1, l, mid, pos, x, y);
    else
      add(id << 1 | 1, mid + 1, r, pos, x, y);
    up(id);
  }
}
void times2(int id, int l, int r, int ql, int qr, bool neg) {
  if (ql <= l && r <= qr) {
    if (neg) {
      mul2[id]--;
      (sumx[id] *= inv2) %= mod;
      (sumy[id] *= 2) %= mod;
    } else {
      mul2[id]++;
      (sumx[id] *= 2) %= mod;
      (sumy[id] *= inv2) %= mod;
    }
  } else {
    down(id);
    int mid = (l + r) >> 1;
    if (ql <= mid) times2(id << 1, l, mid, ql, qr, neg);
    if (mid < qr) times2(id << 1 | 1, mid + 1, r, ql, qr, neg);
    up(id);
  }
}
long long qsum(int id, int l, int r, int ql, int qr, bool y) {
  if (ql <= l && r <= qr) return y ? sumy[id] : sumx[id];
  down(id);
  int mid = (l + r) >> 1;
  long long res = 0;
  if (ql <= mid) res += qsum(id << 1, l, mid, ql, qr, y);
  if (mid < qr) res += qsum(id << 1 | 1, mid + 1, r, ql, qr, y);
  return res % mod;
}
long long ins(int a) {
  times2(1, 1, len, a, len, false);
  int rk = S.qsum(a) + 1;
  S.add(a, 1);
  long long sx = qsum(1, 1, len, 1, a, false),
            sy = qsum(1, 1, len, a, len, true), xa = ori[a] * pow2[rk] % mod,
            ya = ori[a] * powInv2[rk] % mod;
  add(1, 1, len, a, xa, ya);
  return inv2 * (ya * sx % mod + xa * sy % mod - sx * sy % mod) % mod;
}
long long del(int a) {
  int rk = S.qsum(a);
  S.add(a, -1);
  long long xa = ori[a] * pow2[rk] % mod, ya = ori[a] * powInv2[rk] % mod;
  add(1, 1, len, a, -xa, -ya);
  long long sx = qsum(1, 1, len, 1, a, false),
            sy = qsum(1, 1, len, a, len, true);
  times2(1, 1, len, a, len, true);
  return inv2 * (sx * sy % mod - ya * sx % mod - xa * sy % mod) % mod;
}
}  // namespace sgt
int n, p[300005], q, pos[300005], x[300005];
long long ans;
vector<int> ps;
int main() {
  n = getint();
  pow2[0] = powInv2[0] = 1;
  for (int i = 1; i <= n; i++) {
    pow2[i] = pow2[i - 1] * 2 % mod;
    powInv2[i] = powInv2[i - 1] * inv2 % mod;
    p[i] = getint();
    ps.push_back(p[i]);
  }
  q = getint();
  for (int i = 1; i <= q; i++) {
    pos[i] = getint(), x[i] = getint();
    ps.push_back(x[i]);
  }
  sort(ps.begin(), ps.end());
  len = ps.size();
  for (int i = 1; i <= n; i++) {
    int tmp = lower_bound(ps.begin(), ps.end(), p[i]) - ps.begin();
    ori[tmp + 1] = p[i];
    p[i] = tmp + 1;
    ps[tmp]--;
  }
  for (int i = 1; i <= q; i++) {
    int tmp = lower_bound(ps.begin(), ps.end(), x[i]) - ps.begin();
    ori[tmp + 1] = x[i];
    x[i] = tmp + 1;
    ps[tmp]--;
  }
  for (int i = 1; i <= n; i++) (ans += sgt::ins(p[i])) %= mod;
  putll((ans + mod) % mod, '\n');
  for (int i = 1; i <= q; i++) {
    (ans += sgt::del(p[pos[i]])) %= mod;
    p[pos[i]] = x[i];
    (ans += sgt::ins(x[i])) %= mod;
    putll((ans + mod) % mod, '\n');
  }
  bufo.flush();
  return 0;
}
