func_code_string: #include <bits/stdc++.h>   using namespace std;   inline int read() {     char ch = getchar();     int nega = 1;     while (!isdigit(ch)) {       if (ch ==  - ) nega = -1;       ch = getchar();     }     int ans = 0;     while (isdigit(ch)) {       ans = ans * 10 + ch - 48;       ch = getchar();     }     if (nega == -1) return -ans;     return ans;   }   int add(int x, int y) {     return x + y >= 1000000007 ? x + y - 1000000007 : x + y;   }   int sub(int x, int y) { return x - y < 0 ? x - y + 1000000007 : x - y; }   int mul(int x, int y) { return 1LL * x * y % 1000000007; }   int qpow(int x, int y) {     int ans = 1;     while (y) {       if (y & 1) ans = mul(ans, x);       x = mul(x, x);       y >>= 1;     }     return ans;   }   int inv(int x) { return qpow(x, 1000000007 - 2); }   int pw[600005], ipw[600005], i2 = 500000004;   int p[600005], pos[600005], val[600005], n, Q, cnt;   pair<int, int> v[600005];   struct Node {     int pw, l, r, val;   };   Node merge(Node x, Node y) {     Node ans;     ans.pw = mul(x.pw, y.pw);     ans.l = add(x.l, mul(x.pw, y.l));     ans.r = add(y.r, mul(y.pw, x.r));     ans.val = add(add(mul(x.pw, y.val), mul(x.val, y.pw)), mul(x.l, y.r));     return ans;   }   Node t[600005 * 4];   int d[600005];   void build(int u, int l, int r) {     if (l == r) {       t[u].pw = 1;       return;     }     int mid = (l + r) / 2;     build((u << 1), l, mid);     build((u << 1 | 1), mid + 1, r);     t[u] = merge(t[(u << 1)], t[(u << 1 | 1)]);   }   void update(int u, int l, int r, int p, int opt) {     if (l == r) {       if (opt == 1)         t[u] = (Node){2, d[l], d[l], 0};       else         t[u] = (Node){1, 0, 0, 0};       return;     }     int mid = (l + r) / 2;     if (p <= mid)       update((u << 1), l, mid, p, opt);     else       update((u << 1 | 1), mid + 1, r, p, opt);     t[u] = merge(t[(u << 1)], t[(u << 1 | 1)]);   }   void print() { printf( %d n , mul(t[1].val, ipw[n])); }   signed main() {     pw[0] = 1;     for (int i = 1; i < 600005; i++) pw[i] = add(pw[i - 1], pw[i - 1]);     ipw[0] = 1;     for (int i = 1; i < 600005; i++) ipw[i] = mul(ipw[i - 1], i2);     cin >> n;     for (int i = 1; i <= n; i++) p[i] = read(), v[++cnt] = make_pair(p[i], i);     cin >> Q;     for (int i = 1; i <= Q; i++) {       pos[i] = read(), val[i] = read();       v[++cnt] = make_pair(val[i], i + n);     }     sort(v + 1, v + cnt + 1);     for (int i = 1; i <= n; i++)       p[i] = lower_bound(v + 1, v + cnt + 1, make_pair(p[i], i)) - v;     for (int i = 1; i <= Q; i++)       val[i] = lower_bound(v + 1, v + cnt + 1, make_pair(val[i], i + n)) - v;     for (int i = 1; i <= cnt; i++) d[i] = v[i].first;     build(1, 1, cnt);     for (int i = 1; i <= n; i++) update(1, 1, cnt, p[i], 1);     print();     for (int i = 1; i <= Q; i++) {       update(1, 1, cnt, p[pos[i]], 0);       p[pos[i]] = val[i];       update(1, 1, cnt, p[pos[i]], 1);       print();     }     return 0;   }   