RT,我的代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 100005
struct node{
int maxn,val,l,r;
}tree[4*MAXN];
int n,m,a[MAXN];
inline void build(int i,int l,int r){
tree[i].l=l,tree[i].r=r,tree[i].maxn=-2147483647;
if(l==r){
tree[i].maxn=tree[i].val=a[l];
return;
}
int mid=(l+r)>>1;
build(i*2,l,mid),build(i*2+1,mid+1,r);
tree[i].val=tree[i*2].val+tree[i*2+1].val;
tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
return;
}
inline int sum(int i,int l,int r){
if(tree[i].l>=l&&tree[i].r<=r)
return tree[i].val;
int mid=(tree[i].l+tree[i].r)>>1,res=0;
if(mid>=l)
res+=sum(i*2,l,r);
if(mid+1<=r)
res+=sum(i*2+1,l,r);
return res;
}
inline void update_mod(int i,int l,int r,int x){
if(tree[i].maxn<x)
return;
if(tree[i].l==tree[i].r){
tree[i].maxn%=x;
tree[i].val%=x;
return;
}
int mid=(tree[i].l+tree[i].r)>>1;
if(mid>=l)
update_mod(i*2,l,r,x);
if(mid+1<=r)
update_mod(i*2+1,l,r,x);
tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
tree[i].val=tree[i*2].val+tree[i*2+1].val;
return;
}
inline void update_point(int i,int k,int x){
if(tree[i].l==tree[i].r){
tree[i].maxn=x;
tree[i].val=x;
return;
}
int mid=(tree[i].l+tree[i].r)>>1;
if(k<=mid)
update_point(i*2,k,x);
if(k>=mid+1)
update_point(i*2+1,k,x);
tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);
tree[i].val=tree[i*2].val+tree[i*2+1].val;
return;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
while(m--){
int op;
scanf("%d",&op);
if(op==1){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",sum(1,l,r));
}
else if(op==2){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
update_mod(1,l,r,x);
}
else{
int k,x;
scanf("%d%d",&k,&x);
update_point(1,k,x);
}
}
return 0;
}