#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
template <typename T>
static T randint(T lo, T hi) {
  return uniform_int_distribution<T>(lo, hi)(rng);
}
const int mod = 1e9 + 7, N = 3e5 + 5, i2 = 500000004;
int p2[N], ip2[N];
namespace treap {
struct node {
  node *ch[2];
  int key, prio, sz;
  int sj, si, x;
  node(int key) : key(key) {
    ch[0] = ch[1] = NULL;
    sz = 1;
    prio = randint(0, mod);
    sj = si = key;
    x = 0;
  }
} * root;
node *new_node(int key) { return new node(key); }
int size(node *u) { return u ? u->sz : 0; }
int gx(node *u) { return u ? u->x : 0; }
int gsj(node *u) { return u ? u->sj : 0; }
int gsi(node *u) { return u ? u->si : 0; }
node *update(node *u) {
  if (u) {
    u->sz = size(u->ch[0]) + size(u->ch[1]) + 1;
    u->sj = (gsj(u->ch[0]) + (long long)u->key * ip2[size(u->ch[0])] +
             (long long)gsj(u->ch[1]) * (ip2[size(u->ch[0]) + 1])) %
            mod;
    u->si = (gsi(u->ch[0]) + (long long)u->key * p2[size(u->ch[0])] +
             (long long)gsi(u->ch[1]) * (p2[size(u->ch[0]) + 1])) %
            mod;
    u->x = (gx(u->ch[0]) + gx(u->ch[1]) +
            (long long)u->key * ip2[size(u->ch[0])] % mod * gsi(u->ch[0]) +
            (long long)u->key * gsj(u->ch[1]) % mod * ip2[1] +
            (long long)gsi(u->ch[0]) * gsj(u->ch[1]) % mod *
                ip2[size(u->ch[0]) + 1]) %
           mod;
  }
  return u;
}
node *merge(node *u, node *v) {
  if (!u || !v) return u ? u : v;
  if (u->prio > v->prio) {
    u->ch[1] = merge(u->ch[1], v);
    return update(u);
  }
  v->ch[0] = merge(u, v->ch[0]);
  return update(v);
}
node *rotate(node *u, bool d) {
  if (u->ch[d]->prio <= u->prio) return update(u);
  node *v = u->ch[d];
  u->ch[d] = v->ch[!d];
  v->ch[!d] = update(u);
  return update(v);
}
node *insert(node *u, int key) {
  if (!u) return new_node(key);
  bool d = key > u->key;
  u->ch[d] = insert(u->ch[d], key);
  return rotate(u, d);
}
node *erase(node *u, int key) {
  if (!u) return u;
  if (u->key == key) {
    if (!u->ch[0] || !u->ch[1]) return u->ch[!u->ch[0]];
    bool d = rand() & 1;
    node *v = u->ch[d];
    while (v->ch[!d] != NULL) v = v->ch[!d];
    u->key = v->key;
    u->ch[d] = erase(u->ch[d], u->key);
    return update(u);
  }
  bool d = u->key < key;
  u->ch[d] = erase(u->ch[d], key);
  return update(u);
}
}  // namespace treap
int main() {
  ios_base::sync_with_stdio(0), cin.tie(0);
  p2[0] = ip2[0] = 1;
  for (int i = 1; i < N; ++i) {
    p2[i] = p2[i - 1] * 2 % mod;
    ip2[i] = (long long)ip2[i - 1] * i2 % mod;
  }
  int n;
  cin >> n;
  vector<pair<int, int>> a(n);
  for (auto &i : a) cin >> i.first, i.second = &i - &a[0];
  sort(a.begin(), a.end());
  treap::node *root = NULL;
  vector<int> r(n);
  for (auto i : a) {
    r[i.second] = i.first;
    root = treap::merge(root, treap::new_node(i.first));
  }
  cout << (long long)root->x * i2 % mod << "\n";
  int q;
  cin >> q;
  for (int i, x; q--;) {
    cin >> i >> x, --i;
    root = treap::erase(root, r[i]);
    r[i] = x;
    root = treap::insert(root, x);
    cout << (long long)root->x * i2 % mod << "\n";
  }
  return 0;
}
