critnos @ 2020-07-24 11:09:01
#include<bits/stdc++.h>
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#pragma GCC optimize(3,"Ofast","inline")
#define ls w<<1
#define rs w<<1|1
using namespace std;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') w=ch=='-'?-1:w,ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
struct seg
{
int l,r;
int sum,lsum,rsum,mx;
}t[2000005];
int wz[500005];
seg merge(seg x,seg y)
{
seg ret;
ret.sum=x.sum+y.sum;
ret.lsum=max(x.lsum,x.sum+y.lsum);
ret.rsum=max(y.rsum,y.sum+x.rsum);
ret.mx=max(max(x.mx,y.mx),x.rsum+y.lsum);
return ret;
}
void init(int w,int v)
{
t[w].sum=t[w].lsum=t[w].rsum=t[w].mx=v;
}
void build(int w,int l,int r)
{
if(l==r) init(w,read()),wz[l]=w;
else
{
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
t[w]=merge(t[ls],t[rs]);
}
t[w].l=l,t[w].r=r;
}
void add(int x,int y)
{
int w=wz[x];
init(w,y);
for(w>>=1;w>=1;w>>=1)
{
//cout<<w<<endl;
seg lans=t[ls],rans=t[rs];
t[w]=merge(lans,rans);
}
}
seg ask(int w,int l,int r)
{
if(t[w].l>=l&&t[w].r<=r)
{
//cout<<t[w].l<<' '<<t[w].r<<endl;
return t[w];
}
if(t[ls].r>=l&&t[rs].l<=r)
{
seg lans=ask(ls,l,r),rans=ask(rs,l,r);
return merge(lans,rans);
}
if(t[ls].r>=l) return ask(ls,l,r);
return ask(rs,l,r);
}
int main()
{
int n=read(),m=read(),opt,l,r;
build(1,1,n);
while(m--)
{
opt=read(),l=read(),r=read();
if(l>r) swap(l,r);
//cout<<opt<<' '<<l<<' '<<r<<endl;
if(opt==1) printf("%d\n",ask(1,l,r).mx);
else add(l,r);
}
}
比如那个 add
,我输出参数
by critnos @ 2020-07-24 11:11:12
void add(int x,int y)
{
cout<<x<<' '<<y<<endl;
int w=wz[x];
init(w,y);
for(w>>=1;w>=1;w>>=1)
{
//cout<<w<<endl;
seg lans=t[ls],rans=t[rs];
t[w]=merge(lans,rans);
}
}
by zhjxaoini @ 2020-07-24 11:17:53
@mcyl35
if(l>r) swap(l,r);
这句应该写在 opt==1
的情况里面吧
by critnos @ 2020-07-24 11:19:44
@zhaojinxi thxthx,谢谢大佬
by critnos @ 2020-07-24 11:53:00
thx,过了