萌新学线段树,想用线段树A掉树状数组,但是debug实在找不出来了,求大佬debug/kk
我尽量都用注释写出代码要做啥了,求大佬帮下忙qwq
测试结果:都WA了
#include<cstdio>
const int qwq =500010;
using namespace std;
int n,m,opt;
int a[qwq];
long long ans;
int read()//快读
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
struct TREE//结构体建树
{
int l,r;
int sum;
}tree[qwq<<2];
void pushup_sum(int i)//维护子节点与父节点的关系
{
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
void build(int i,int l,int r)//递归建树
{
tree[i].l=l;tree[i].r=r;
if(l==r)
{
tree[i].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(i<<1,l,mid);
build(i<<1|1,mid+1,r);
pushup_sum(i);
}
void add(int i,int l,int r,int k)//区间修改
{
if(l<=tree[i].l && tree[i].r<=r)//如果完全被包含就直接修改
{
tree[i].sum+=k;
return;
}
if(l<=tree[i<<1].r)add(i<<1,l,r,k);//如果左子树可以修改
if(tree[i<<1|1].l<=r)add(i<<1|1,l,r,k);//如果右子树可以修改
}
void query(int i,int dis)
{
ans+=tree[i].sum;
if(tree[i].l==tree[i].r)//如果是叶子节点
return;
if(dis<=tree[i<<1].r)query(i<<1,dis);//如果这点在左子树
if(tree[i<<1|1].l<=dis)query(i<<1|1,dis);//如果这点在右子树
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++)
{
opt=read();
if(opt==1)
{
int x=read(),y=read(),k=read();
add(1,x,y,k);
}
else if(opt==2)
{
int x=read();
query(1,x);
printf("%lld\n",ans);
}
}
return 0;
}