求条模板线段树
题目:

代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3000010;
int n,q,a[N],b[N],cnt;
int op,x,y;
struct treenode {
int l,r;
int da,ma,mi;
} t[N*4];
void build(int p,int l,int r) {
t[p].l=l;
t[p].r=r;
if(l==r) {
t[p].da=a[l];
t[p].ma=a[l];
t[p].mi=a[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
t[p].da=t[p*2].da+t[p*2+1].da;
t[p].ma=max(t[p*2].ma,t[p*2+1].ma);
t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
}
void change(int p,int x,int v) {
if(t[p].l==t[p].r) {
t[p].da=v;
t[p].mi=v;
t[p].ma=v;
return;
}
int mid=(t[p].l+t[p].r)/2;
if(x<=mid) {
change(p*2,x,v);
} else {
change(p*2+1,x,v);
}
t[p].da=t[p*2].da+t[p*2+1].da;
t[p].ma=max(t[p*2].ma,t[p*2+1].ma);
t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
}
int ask(int p,int l,int r,int op) {
if(l<=t[p].l&&r>=t[p].r) {
if(op==2) {
return t[p].da;
} else if(op==3) {
return t[p].ma;
} else {
return t[p].mi;
}
}
int mid=(t[p].l+t[p].r)/2;
int val=0;
if(l<=mid) {
if(op==2) {
val+=ask(p*2,l,r,op);
}
if(op==3) {
val=INT_MIN;
val=max(val,ask(p*2,l,r,op));
}
if(op==4) {
val=(INT_MAX);
val=min(val,ask(p*2,l,r,op));
}
}
if(r>mid) {
if(op==2) {
val+=ask(p*2+1,l,r,op);
}
if(op==3) {
val=INT_MIN;
val=max(val,ask(p*2+1,l,r,op));
}
if(op==4) {
val=INT_MAX;
val=min(val,ask(p*2+1,l,r,op));
}
}
return val;
}
signed main() {
scanf("%lld%lld",&n,&q);
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
}
build(1,1,n);
for(int i=1; i<=q; i++) {
scanf("%lld%lld%lld",&op,&x,&y);
if(op==1) {
change(1,x,a[x]+y);
} else {
b[++cnt]=ask(1,x,y,op);
}
}
for(int i=1; i<=cnt; i++) {
printf("%lld\n",b[i]);
}
return 0;
}