rt。
#include <bits/stdc++.h>
using namespace std;
long long d[int(4e5+10)],maxx[int(4e5+10)],a[int(1e5+10)];
void build(int s,int t,int p)
{
if(s==t)
{
d[p]=maxx[p]=a[s];
return;
}
int m=(s+t)>>1;
build(s,m,p*2);
build(m+1,t,p*2+1);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
void mod(int l,int r,int s,int t,int p,long long x)
{
if(maxx[p]<x&&l<=s&&t<=r) return;
if(l<=s&&t<=r&&s==t)
{
d[p]%=x;
maxx[p]%=x;
return;
}
int m=(s+t)>>1;
if(l<=m) mod(l,r,s,m,p*2,x);
if(m<r) mod(l,r,m+1,t,p*2+1,x);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
void update(int k,int s,int t,int p,long long x)
{
if(k==s&&k==t)
{
d[p]=maxx[p]=x;
return;
}
int m=(s+t)>>1;
if(k<=m) update(k,s,m,p*2,x);
else update(k,m+1,t,p*2+1,x);
d[p]=d[p*2]+d[p*2+1];
maxx[p]=max(maxx[p*2],maxx[p*2+1]);
}
long long query(int l,int r,int s,int t,int p)
{
if(l<=s&&t<=r)
{
return d[p];
}
int m=(s+t)>>1;
long long ans=0;
if(l<=m) ans+=query(l,r,s,m,p*2);
if(r>m) ans+=query(l,r,m+1,t,p*2+1);
return ans;
}
int main()
{
long long n,m,opt,l,r,x;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
cin>>opt>>l>>r;
if(l>r) swap(l,r);
if(opt==1)
{
cout<<query(l,r,1,n,1)<<endl;
}
else if(opt==2)
{
cin>>x;
mod(l,r,1,n,1,x);
}
else
{
update(l,1,n,1,r);
}
}
return 0;
}