#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << H;
  debug_out(T...);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &out, const pair<T1, T2> &item) {
  out << '(' << item.first << ", " << item.second << ')';
  return out;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  for (const auto &item : v) out << item << ' ';
  return out;
}
const int N = 600010;
const int MOD = 1000000007;
int inv2[N];
struct Node {
  int nr, pref, suff;
  Node(int v = 0)
      : nr(v > 0),
        pref(1LL * v * inv2[1] % MOD),
        suff(1LL * v * inv2[1] % MOD) {}
};
int m;
int v[N], pos[N], updPos[N], x[N], currPos[N];
Node st[2 * N];
int pw(int base, int exp, int mod) {
  int res;
  for (res = 1; exp; exp >>= 1) {
    if (exp & 1) res = (1LL * res * base) % mod;
    base = (1LL * base * base) % mod;
  }
  return res;
}
int modInv(int base, int mod) { return pw(base, mod - 2, mod); }
Node combine(const Node &a, const Node &b) {
  Node res;
  res.nr = a.nr + b.nr;
  res.pref = (1LL * a.pref * inv2[b.nr] + b.pref) % MOD;
  res.suff = (a.suff + 1LL * b.suff * inv2[a.nr]) % MOD;
  return res;
}
void build() {}
void update(int p, int val) {
  for (st[p += m] = Node(val); p > 1; p >>= 1)
    if (p & 1)
      st[p >> 1] = combine(st[p ^ 1], st[p]);
    else
      st[p >> 1] = combine(st[p], st[p ^ 1]);
}
Node query(int l, int r) {
  if (r < 0 || l >= m) return Node(0);
  Node resl(0), resr(0);
  for (l += m, r += m + 1; l < r; l >>= 1, r >>= 1) {
    if (l & 1) resl = combine(resl, st[l++]);
    if (r & 1) resr = combine(st[--r], resr);
  }
  return combine(resl, resr);
}
void setVal(int p, int val, int &curr) {
  Node l = query(0, p - 1), r = query(p + 1, m - 1);
  int x = 1LL * (val - v[p] + MOD) * inv2[1] % MOD;
  int tmp = (1LL * l.pref * r.suff) % MOD;
  curr = (curr + 1LL * l.pref * x + 1LL * x * r.suff +
          1LL * (val ? (MOD - inv2[1]) : inv2[1]) * tmp) %
         MOD;
  v[p] = val;
  update(p, val);
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, q;
  vector<pii> ev;
  inv2[0] = 1;
  inv2[1] = modInv(2, MOD);
  for (int i = 2; i < N; ++i) inv2[i] = (1LL * inv2[i - 1] * inv2[1]) % MOD;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    cin >> v[i];
    ev.push_back({v[i], i});
    v[i] = 0;
  }
  cin >> q;
  for (int i = 0; i < q; ++i) {
    cin >> pos[i] >> x[i];
    --pos[i];
    ev.push_back({x[i], n + i});
  }
  sort(ev.begin(), ev.end());
  m = ev.size();
  int curr = 0;
  for (int i = 0; i < m; ++i) {
    if (ev[i].second < n)
      setVal(i, ev[i].first, curr), currPos[ev[i].second] = i;
    else
      updPos[ev[i].second - n] = i;
  }
  cout << curr << '\n';
  for (int i = 0; i < q; ++i) {
    setVal(currPos[pos[i]], 0, curr);
    setVal(updPos[i], x[i], curr);
    currPos[pos[i]] = updPos[i];
    cout << curr << '\n';
  }
  return 0;
}
