单点更新+求区间和
#include <bits/stdc++.h>
using namespace std;
#define lson root<<1
#define rson root<<1|1
#define MID int m = (r + l) / 2
typedef long long ll;
int data[112345], n;
char str[10];
struct node
{
int sum;
}tree[112345 << 2];
node Merge(node a, node b)
{
node res;
res.sum = a.sum + b.sum;
return res;
}
void build(int root, int l, int r)
{
if(l == r)
{
tree[root].sum = data[l];
return ;
}
MID;
build(lson, l, m);
build(rson, m + 1, r);
tree[root] = Merge(tree[lson], tree[rson]);
}
void update(int root, int l, int r, int pos, int v, int num)
{
if(l > pos || r < pos) return ;
if(l == r)
{
if(num)
tree[root].sum += v;
else
tree[root].sum -= v;
return ;
}
MID;
update(lson, l, m, pos, v, num);
update(rson, m + 1, r, pos, v, num);
tree[root] = Merge(tree[lson], tree[rson]);
}
int query(int root, int l, int r, int ul, int ur)
{
if(l > ur || r < ul) return 0;
if(ul <= l && ur >= r) return tree[root].sum;
MID;
return query(lson, l, m, ul, ur) + query(rson, m + 1, r, ul, ur);
}
int main()
{
int t, i, cas = 1;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 1; i <= n; i++)
scanf("%d", &data[i]);
build(1, 1, n);
printf("Case %d:\n", cas++);
while(~scanf("%s", str))
{
int u, p;
if(!strcmp(str, "End")) break;
if(!strcmp(str, "Query"))
{
int ul, ur;
scanf("%d %d", &ul, &ur);
int v = query(1, 1, n, ul, ur);
printf("%d\n", v);
}
else if(!strcmp(str, "Add"))
{
scanf("%d %d", &u, &p);
update(1, 1, n, u, p, 1);
}
else
{
scanf("%d %d", &u, &p);
update(1, 1, n, u, p, 0);
}
}
}
}
区间更新+区间查询
#include <cstdio>
#include <iostream>
using namespace std;
#define lson root << 1
#define rson root <<1|1
#define MID int m = (l + r) / 2
typedef long long ll;
const int maxn = 112345;
int n;
ll data[maxn];
struct node
{
ll sum;
ll lazy;
} tree[maxn << 2];
node Merge(node a, node b)
{
node res;
res.sum = a.sum + b.sum;
res.lazy = 0;
return res;
}
void build(int root, int l, int r)
{
tree[root].lazy = 0;
if(l == r)
{
tree[root].sum = data[l];
return ;
}
MID;
build(lson, l, m);
build(rson, m + 1, r);
tree[root] = Merge(tree[lson], tree[rson]);
}
void push_down(int root, int l, int r)
{
if(tree[root].lazy == 0) return ;
MID;
ll z = tree[root].lazy;
tree[lson].lazy += z;
tree[rson].lazy += z;
tree[lson].sum += (m - l + 1) * z;
tree[rson].sum += (r - m) * z;
tree[root].lazy = 0;
}
void update(int root, int l, int r, int ul, int ur, ll num)
{
if(ur < l || r < ul) return ;
if(ul <= l && r <= ur)
{
tree[root].lazy += num;
tree[root].sum += (r - l + 1) * num;
return ;
}
push_down(root, l, r);
MID;
update(lson, l, m, ul, ur, num);
update(rson, m + 1, r, ul, ur, num);
tree[root] = Merge(tree[lson], tree[rson]);
}
ll query(int root, int l, int r, int ul, int ur)
{
if(ul > r || ur < l) return 0;
if(ul <= l && r <= ur)
{
return tree[root].sum;
}
push_down(root, l, r);
MID;
return query(lson, l, m, ul, ur) + query(rson, m + 1, r, ul, ur);
}
int main()
{
int m, ur, i, ul;
ll num;
char s[2];
while(~scanf("%d %d", &n, &m))
{
for(i = 1; i <= n; i++)
scanf("%lld", &data[i]);
build(1, 1, n);
while(m--)
{
scanf("%s",s);
if(s[0] == 'Q')
{
scanf("%d %d", &ul, &ur);
ll v = query(1, 1, n, ul,ur);
printf("%lld\n", v);
}
else
{
scanf("%d %d %lld", &ul, &ur, &num);
update(1, 1, n, ul, ur, num);
}
}
}
return 0;
}