#include<bits/stdc++.h>
#define N 100010
using namespace std;
int t[4*N],tt[4*N],a[N];
int s,maxn;
void build(int l,int r,int d)
{
if(l==r)
{
t[d]=a[l];
tt[d]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,2*d);
build(mid+1,r,2*d+1);
t[d]=t[2*d]+t[2*d+1];
tt[d]=max(tt[2*d],tt[2*d+1]);
return ;
}
void update(int pos,int l,int r,int d,int num)
{
if(l==r)
{
t[d]=num;
tt[d]=num;
return ;
}
int mid=(l+r)/2;
if(pos<=mid)
update(pos,l,mid,2*d,num);
else
update(pos,mid+1,r,2*d+1,num);
t[d]=t[2*d]+t[2*d+1];
tt[d]=max(tt[2*d],tt[2*d+1]);
return ;
}
int query(int l,int r,int L,int R,int d)
{
if(l==L&&r==R)
{
return t[d];
}
int mid=(L+R)/2;
if(r<=mid)
{
return query(l,r,L,mid,2*d);
}
else if(l>mid)
{
return query(l,r,mid+1,R,2*d+1);
}
else
return query(l,mid,L,mid,2*d)+query(mid+1,r,mid+1,R,2*d+1);
}
int queryma(int l,int r,int L,int R,int d)
{
if(l<=L&&R<=r)
return tt[d];
int mid=(L+R)/2;
int ret=0;
if(l<=mid)
ret=max(ret,queryma(l,r,L,mid,2*d));
if(r>mid)
ret=max(ret,queryma(l,r,mid+1,R,2*d+1));
return ret;
}
int main()
{
int p,x,y,n,m,s;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,n,1);
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&p,&x,&y);
if(p==1)
{
update(x,1,n,1,y);
}
else if(p==2)
{
s=query(x,y,1,n,1);
printf("%d\n",s);
}
else
{ maxn=queryma(x,y,1,n,1);
printf("%d\n",maxn);
}
}
}
线段树模板
最新推荐文章于 2021-02-05 22:35:05 发布