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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> #include <queue> #include <cmath> #include <cstdio> #include <map>
using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) #define PI acos(-1)
typedef long long ll; int dir8[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; int dir4[4][2] = {1, 0, 0, 1, -1, 0, 0, -1}; const int INF = 0x3f3f3f3fll; const long long intF = 0x3f3f3f3f3f3f3f3fll; const int MAXn = 1e5 + 5; const int mod = 1e9 + 7;
struct node { int l, r, w, flag; int mid() { return (r + l) / 2; } int dis() { return r - l + 1; } } a[MAXn * 4];
void build(int k, int l, int r) { a[k].l=l; a[k].r=r; a[k].w=0; a[k].flag=0; if (l == r) { cin >> a[k].w; return; } build(k << 1, l ,a[k].mid()); build(k<<11, a[k].mid()+1, r ); a[k].w=a[k<<1].w+a[k<<11].w; }
void down(int k) { a[k << 1].w += a[k].flag * a[k << 1].dis(); a[k << 1 1].w += a[k].flag * a[k << 1 1].dis(); a[k << 1].flag += a[k].flag; a[k << 1 1].flag += a[k].flag; a[k].flag = 0; }
void update(int k, int l, int r, int w) { if(a[k].l==l&&a[k].r==a[k].l) { a[k].w+=a[k].dis()*w; a[k].flag+=w; return ; } if(a[k].flag) down(k); if(a[k].mid()>=l) update(k<<1,l,r,w); if(a[k].mid()<r) update(k<<11,l,r,w); a[k].w=a[k<<1].w+a[k<<11].w; }
int query(int k, int l, int r) { if (a[k].l >= l && a[k].r <= r) return a[k].w; if (a[k].flag) down(k); int sum = 0; if (a[k].mid() >= l) sum += query(k << 1, l, r); if (a[k].mid() < r) sum += query(k << 1 1, l, r); a[k].w = a[k << 1].w + a[k << 1 1].w; return sum; }
int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T,ii=0; cin >> T; while (T--) { ii++; cout<<"Case "<<ii<<":"<<endl; int n; cin>>n; build(1,1,n); while(1) { string s; int i,j; cin>>s; if(s=="End") break; cin>>i>>j; if(s=="Sub") j=-j; if(s=="Query"){ cout<<query(1,i,j)<<endl; continue; } update(1,i,i,j); } } return 0; }
|