敌兵布阵
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210312160805283.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ2MTczODA1,size_16,color_FFFFFF,t_70)
code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ACM_LOCAL
using namespace std;
typedef long long ll;
const double PI = acos(-1);
const double eps = 1e-4;
const int MOD = 1e9 + 7;
const int M = 1e7 + 10;
const int N = 3e5 + 10;
struct node {
int l, r;
ll sum, lazy;
}seg[N << 2];
int a[N], n, l, r, x;
string op;
void pushup(int rt) {
seg[rt].sum = seg[rt << 1].sum + seg[rt << 1 | 1].sum;
}
void pushdown(int rt) {
if(seg[rt].lazy) {
seg[rt << 1].lazy += seg[rt].lazy;
seg[rt << 1 | 1].lazy += seg[rt].lazy;
seg[rt << 1].sum += 1ll * (seg[rt << 1].r - seg[rt << 1].l + 1) * seg[rt].lazy;
seg[rt << 1 | 1].sum += 1ll * (seg[rt << 1 | 1].r - seg[rt << 1 | 1].l + 1) * seg[rt].lazy;
seg[rt].lazy = 0;
}
}
void build(int rt, int ql, int qr) {
seg[rt] = {
ql, qr, 0, 0};
if(ql == qr) {
seg[rt].sum = a[ql];
return;
}
int mid = ql + qr >> 1;
build(rt << 1, ql, mid);
build(rt << 1 | 1, mid + 1, qr);
pushup(rt);
}
void modify(int rt, int ql, int qr, int x) {
if(ql <= seg[rt].l && seg[rt].r <= qr) {
seg[rt].sum += x * (seg[rt].r - seg[rt].l + 1);
seg[rt].lazy += x;
return;
}
pushdown(rt);
int mid = seg[rt].l + seg[rt].r >> 1;
if(ql <= mid) modify(rt << 1, ql, qr, x);
if(qr > mid) modify(rt << 1 | 1, ql, qr, x);
pushup(rt);
}
ll query(int rt, int ql, int qr) {
if(ql <= seg[rt].l && seg[rt].r <= qr) {
return seg[rt].sum;
}
pushdown(rt);
int mid = seg[rt].l + seg[rt].r >> 1;
ll res = 0;
if(ql <= mid) res += query(rt << 1, ql, qr);
if(qr > mid) res += query(rt << 1 | 1, ql, qr);
return res;
}
void solve() {
while(1) {
cin >> op;
if(op[0] == 'E') break;
cin >> l >> x;
if(op[0] == 'A') modify(1, l, l, x);
else if(op[0] == 'S') modify(1, l, l, -x);
else if(op[0] == 'Q') cout << query(1, l, x) << endl;
}
}
int main() {
IO;
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
#endif
int o = 1, cases = 0;
cin >> o;
while(o --) {
cin >> n;
cout << "Case " << ++ cases << ':' << endl;
for(int i = 1; i <= n; ++ i) cin >> a[i];
build(1, 1, n);
solve();
}
return 0;
}