1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include<bits/stdc++.h> using namespace std; #define ll long long typedef pair<ll, ll> pii; const int maxn = 2e6 + 10; const int INF = 0x3f3f3f3f; const ll mod = 1000000007; int n, m; #define mid ((l+r)>>1) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 ll t1[maxn << 2], t2[maxn << 2]; void update1(int l, int r, int rt, int q, ll x) { if (l == r) { t1[rt] = x; return; } if (q <= mid)update1(lson, q, x); else update1(rson, q, x); t1[rt] = t1[rt << 1] + t1[rt << 1 | 1]; } void update2(int l, int r, int rt, int q, int x) { if (l == r) { t2[rt] = x; return; } if (q <= mid)update2(lson, q, x); else update2(rson, q, x); t2[rt] = t2[rt << 1] + t2[rt << 1 | 1]; } ll query1(int l, int r, int rt, int ql, int qr) { if (ql > qr)return 0; if (ql <= l && qr >= r)return t1[rt]; ll res = 0; if (ql <= mid)res = (res + query1(lson, ql, qr)) % mod; if (qr > mid)res = (res + query1(rson, ql, qr)) % mod; return res; } ll query2(int l, int r, int rt, int ql, int qr) { if (ql > qr)return 0; if (ql <= l && qr >= r)return t2[rt]; ll res = 0; if (ql <= mid)res = (res + query2(lson, ql, qr)) % mod; if (qr > mid)res = (res + query2(rson, ql, qr)) % mod; return res; } ll ans; int main() { cin >> n; for (int i = 1; i <= n; i++) { char c; scanf(" %c", &c); if(c=='1'){ update1(1, n, 1, i, 1); update2(1, n, 1, i, i); ll tmp = query2(1, n, 1, i + 1, n) - 1ll * i*query1(1, n, 1, i + 1, n); while (tmp < 0)tmp += mod; tmp %= mod; ll tmp2 = 1ll * i*query1(1, n, 1, 1, i - 1) - query2(1, n, 1, 1, i - 1); while (tmp2 < 0)tmp2 += mod; tmp2 %= mod; ans = (ans + tmp + tmp2) % mod; } } cout << ans << endl; cin >> m; while (m--) { int op, b; scanf("%d%d", &op, &b); if (op == 1) { update1(1, n, 1, b, 1); update2(1, n, 1, b, b); ll tmp = query2(1, n, 1, b + 1, n) - 1ll * b*query1(1, n, 1, b + 1, n); while (tmp < 0)tmp += mod; tmp %= mod; ll tmp2 = 1ll * b*query1(1, n, 1, 1, b - 1) - query2(1, n, 1, 1, b - 1); while (tmp2 < 0)tmp2 += mod; tmp2 %= mod; ans = (ans + tmp + tmp2) % mod; } else { update1(1, n, 1, b, 0); update2(1, n, 1, b, 0); ll tmp = query2(1, n, 1, b + 1, n) - 1ll * b*query1(1, n, 1, b + 1, n); while (tmp < 0)tmp += mod; tmp %= mod; ll tmp2 = 1ll * b*query1(1, n, 1, 1, b - 1) - query2(1, n, 1, 1, b - 1); while (tmp2 < 0)tmp2 += mod; tmp2 %= mod; ans = (ans - tmp - tmp2 + 2 * mod) % mod; } printf("%lld\n", ans); } return 0; }
|