单点修改+区间最值
#include<bits/stdc++.h>
using namespace std;
int c[1111111],n,m,i,j,k,kk[1111111],cc[1111111];
int lb(int x)
{
return (x&(-x));
}
void add(int x,int y)
{
c[x]=y;
while(x<=n)
{
cc[x]=y;
for(int j=1;j<lb(x);j<<=1)
{
if(cc[x]<cc[x-j])
{
cc[x]=cc[x-j];
}
}
x+=lb(x);
}
}
int qu(int x,int y)
{
int tot=0;
while(1)
{
if(tot<c[y]) tot=c[y];
if(x==y) break;
for(y-=1;y-x>=lb(y);y-=lb(y))
{
if(tot<cc[y]) tot=cc[y];
}
}
return tot;
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&kk[i]);
c[i]=kk[i];
cc[i]=kk[i];
for(j=1;j<lb(i);j<<=1)
{
if(cc[i]<cc[i-j])
{
cc[i]=cc[i-j];
}
}
}
for(i=1;i<=m;i++)
{
scanf("%d",&k);
if(k==1)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,kk[x]+y);
kk[x]+=y;
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",(qu(x,y)));
}
}
}