以下是代码,样例的第二个输入有问题,但老看不出来。
#include <bits/stdc++.h>
using namespace std;
struct Seg {
int l,r,sum;
} t[400001];
int a[100001];
void BuildTree(int x,int y,int num) {
t[num].l = x,t[num].r = y;
if(x == y) t[num].sum = a[y];
else {
int Lson = num << 1,Rson = Lson | 1;
BuildTree(x,(x + y) >> 1,Lson);
BuildTree(((x + y) >> 1) + 1,y,Rson);
t[num].sum = t[Lson].sum + t[Rson].sum;
}
}
void Update(int i,int j,int num) {
t[num].sum += j;
if(t[num].l == i && t[num].r == i) return;
if(i > ((t[num].l + (t[num].r)) >> 1))
Update(i,j,num << 1 | 1);
else
Update(i,j,num << 1);
}
int Query(int x,int y,int num) {
if(x <= t[num].l && y >= t[num].r) return t[num].sum;
int mid = (t[num].l + t[num].r) >> 1;
int ans = 0;
if(x <= mid)
ans += Query(x,y,num << 1);
if(y > mid)
ans += Query(x,y,num << 1 | 1);
return ans;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
BuildTree(1,n,1);
while(m--) {
int choice,x,y,k;
scanf("%d%d%d",&choice,&x,&y);
if(choice == 1) {
scanf("%d",&k);
Update(x,y,1);
}
else printf("%d\n",Query(x,y,1));
}
return 0;
}
目前估测是修改或查询的问题,请各位大佬帮忙看看。