不知道哪里错了QAQ
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<cstdio>
#include<ctime>
#include<stack>
#define int long long
#define lp (p<<1)
#define rp (p<<1|1)
#define mid ((l+r)>>1)
#define N 100005
#define M (N<<2)
using namespace std;
int n,m,l,r,op,mod;
int a[N],maxx[M],sum[M];
int re()
{
int x=0,p=1;
char y=getchar();
for(;y>'9'||y<'0';y=getchar())
if(y=='-')
p=-p;
for(;y>='0'&&y<='9';y=getchar())
x=x*10+y-'0';
return x*p;
}
void wr(int x)
{
if(x<0)
x=-x,putchar('-');
if(x>9)
wr(x/10);
putchar(x%10+'0');
}
void Push_up(int p){
sum[p]=sum[lp]+sum[rp];
maxx[p]=max(maxx[lp],maxx[rp]);
}
void Build(int l,int r,int p){
if(l==r){
sum[p]=a[l];
maxx[p]=a[l];
return;
}
Build(l,mid,lp);
Build(mid+1,r,rp);
Push_up(p);
}
int Query(int ql,int qr,int l,int r,int p){
if(ql<=l&&qr>=r)
return sum[p];
int ans=0;
if(ql<=mid)
ans+=Query(ql,qr,l,mid,lp);
if(qr>mid)
ans+=Query(ql,qr,mid+1,r,rp);
return ans;
}
void Mo(int ml,int mr,int l,int r,int p,int mod){
if(l==r){
sum[p]%=mod;
maxx[p]%=mod;
return;
}
if(ml<=mid&&maxx[lp]>=mod)
Mo(ml,mr,l,mid,lp,mod);
if(mr>mid&&maxx[rp]>=mod)
Mo(ml,mr,mid+1,r,rp,mod);
Push_up(p);
}
void Change(int cl,int cr,int l,int r,int p){
if(l==r){
sum[p]=cr;
maxx[p]=cr;
return;
}
if(cl<=mid)
Change(cl,cr,l,mid,lp);
else
Change(cl,cr,mid+1,r,rp);
Push_up(p);
}
signed main(){
n=re(),m=re();
for(int i=1;i<=n;i++)
a[i]=re();
Build(1,n,1);
while(m--){
op=re(),l=re(),r=re();
if(op==1){
wr(Query(l,r,1,n,1));putchar('\n');
}
if(op==2){
mod=re();
Mo(l,r,1,n,1,mod);
}
if(op==3)
Change(l,r,1,n,1);
}
return 0;
}