一直编译失败又不显示哪里出错是什么鬼
本地又好好的
附上代码:
#include<bits/stdc++.h>
using namespace std;
struct SegmentTree{
int pre=0,suf=0,data=-1e9,sum=0,left=0,right=0;
#define pre(x) c[x].pre
#define suf(x) c[x].suf
#define data(x) c[x].data
#define sum(x) c[x].sum
#define l(x) c[x].left
#define r(x) c[x].right
}c[2000010];
int a[500010],tmpx,tmpy,n,m,flag;
void built(int l,int r,int rt)
{
l(rt)=l;r(rt)=r;
if(l==r)
{
pre(rt)=suf(rt)=data(rt)=sum(rt)=a[l];
return;
}
int mid=(l+r)>>1;
built(l,mid,rt<<1);
built(mid+1,r,rt<<1|1);
pre(rt)=max(pre(rt<<1),sum(rt<<1)+pre(rt<<1|1));
suf(rt)=max(suf(rt<<1|1),sum(rt<<1|1)+suf(rt<<1));
sum(rt)=sum(rt<<1)+sum(rt<<1|1);
data(rt)=max(suf(rt<<1)+pre(rt<<1|1),max(data(rt<<1),data(rt<<1|1)));
}
SegmentTree query(int l,int r,int rt)
{
if(l<=l(rt)&&r(rt)<=r)
return c[rt];
int mid=(l(rt)+r(rt))>>1;
if(mid>=l&&mid<r)
{
SegmentTree ans,a,b;
a=query(l,r,rt<<1);
b=query(l,r,rt<<1|1);
ans.data=max(ans.data,max(a.suf+b.pre,max(a.data,b.data)));
ans.pre=max(a.pre,a.sum+b.pre);
ans.suf=max(b.suf,b.sum+a.suf);
ans.sum=a.sum+b.sum;
return ans;
}
else if(mid>=l) return query(l,r,rt<<1);
else return query(l,r,rt<<1|1);
}
void change(int w,int p,int rt)
{
if(l(rt)==r(rt))
{
pre(rt)=suf(rt)=data(rt)=sum(rt)=a[w]=p;
return;
}
int mid=(l(rt)+r(rt))>>1;
if(mid>=w) change(w,p,rt<<1);
else change(w,p,rt<<1|1);
pre(rt)=max(pre(rt<<1),sum(rt<<1)+pre(rt<<1|1));
suf(rt)=max(suf(rt<<1|1),sum(rt<<1|1)+suf(rt<<1));
sum(rt)=sum(rt<<1)+sum(rt<<1|1);
data(rt)=max(suf(rt<<1)+pre(rt<<1|1),max(data(rt<<1),data(rt<<1|1)));
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
built(1,n,1);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&flag,&tmpx,&tmpy);
if(flag==2) change(tmpx,tmpy,1);
else
{
if(tmpx>tmpy) swap(tmpx,tmpy);
printf("%d\n",query(tmpx,tmpy,1).data);
}
}
return 0;
}