diff --git a/S2OJ/14/14.cpp b/S2OJ/14/14.cpp new file mode 100644 index 00000000..aa2318c7 --- /dev/null +++ b/S2OJ/14/14.cpp @@ -0,0 +1,91 @@ +#pragma GCC optimize("Ofast") + +#include + +using namespace std; + +int n, l, r, cntl, cntr; +char op; +long long x, c1[300005], c2[300005]; + +inline int lowbit(int x) { + return x & -x; +} + +inline void add1(int pos, long long x) { + while (pos <= n) { + c1[pos] += x; + pos += lowbit(pos); + } +} + +inline void add2(int pos, long long x) { + while (pos <= n) { + c2[pos] += x; + pos += lowbit(pos); + } +} + +inline long long query1(int pos) { + long long ret = 0; + while (pos) { + ret += c1[pos]; + pos -= lowbit(pos); + } + return ret; +} + +inline long long query2(int pos) { + long long ret = 0; + while (pos) { + ret += c2[pos]; + pos -= lowbit(pos); + } + return ret; +} + +int main() { + std::ios::sync_with_stdio(false); + cin >> n; + for (int i = 0; i < n; i++) { + cin >> op; + if (op == 'I') { + cin >> x; + add1(++cntl, x); + } else if (op == 'D') { + x = query1(cntl) - query1(cntl - 1); + add1(cntl--, -x); + } else if (op == 'L') { + if (cntl > 0) { + x = query1(cntl) - query1(cntl - 1); + add1(cntl--, -x); + add2(++cntr, x); + } + } else if (op == 'R') { + if (cntr > 0) { + x = query2(cntr) - query2(cntr - 1); + add2(cntr--, -x); + add1(++cntl, x); + } + } else if (op == 'Q') { + cin >> l >> r; + if (r <= cntl) { + cout << query1(r) - query1(l - 1) << endl; + } else if (l > cntl) { + cout << query2(cntl + cntr - l + 1) - query2(cntl + cntr - r) << endl; + } else { + cout << query1(cntl) - query1(l - 1) + query2(cntr) - query2(cntl + cntr - r) << endl; + } + } else if (op == 'C') { + cin >> l >> x; + if (l <= cntl) { + r = query1(l) - query1(l - 1); + add1(l, x - r); + } else { + r = query2(cntl + cntr - l + 1) - query2(cntl + cntr - l); + add2(cntl + cntr - l + 1, x - r); + } + } + } + return 0; +}