cf的数据毒瘤,#3直接巨大数据没法调
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace FAST_IO
{
template<typename T> void read(T &a)
{
a=0;
int f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(isdigit(c))
{
a=a*10+c-'0';
c=getchar();
}
a=a*f;
}
template <typename T> void write(T a)
{
if(a<0)
{
a=-a;
putchar('-');
}
if(a>9)
{
write(a/10);
}
putchar(a%10+'0');
}
template <typename T> void writeln(T a)
{
write(a);
puts("");
}
}
const int maxn=2e5+999;
int belong[maxn],l[maxn],r[maxn],num,_size;
int n,a[maxn],add[maxn],m,maxt[maxn];
void build()
{
for(int i=1;i<=n;i++)
{
FAST_IO::read(a[i]);
}
_size=sqrt(n);
num=n/_size;
if(n%_size)
{
num++;
}
for(int i=1;i<=num;i++)
{
l[i]=(i-1)*_size+1;
r[i]=i*_size;
}
r[num]=n;
for(int i=1;i<=n;i++)
{
belong[i]=i/_size;
if(i%_size)
{
belong[i]++;
}
add[belong[i]]+=a[i];
maxt[belong[i]]=max(maxt[belong[i]],a[i]);
}
}
void update(int ls,int rs,int mod)
{
int x=belong[ls],y=belong[rs];
if(x==y)
{
if(maxt[x]>=mod)
{
for(int i=ls;i<=rs;i++)
{
add[x]-=a[i];
a[i]%=mod;
add[x]+=a[i];
}
maxt[x]=0;
for(int i=l[x];i<=r[x];i++)
{
maxt[x]=max(maxt[x],a[i]);
}
}
}
else
{
if(maxt[x]>=mod)
{
for(int i=ls;i<=r[x];i++)
{
add[x]-=a[i];
a[i]%=mod;
add[x]+=a[i];
}
maxt[x]=0;
for(int i=l[x];i<=r[x];i++)
{
maxt[x]=max(maxt[x],a[i]);
}
}
for(int i=x+1;i<=y-1;i++)
{
if(maxt[i]>=mod)
{
for(int j=l[i];j<=r[i];j++)
{
add[i]-=a[j];
a[j]%=mod;
add[i]+=a[j];
}
maxt[i]=0;
for(int j=l[i];j<=r[i];i++)
{
maxt[i]=max(maxt[i],a[j]);
}
}
}
if(maxt[y]>=mod)
{
for(int i=l[y];i<=rs;i++)
{
add[y]-=a[i];
a[i]%=mod;
add[y]+=a[i];
}
maxt[y]=0;
for(int i=l[y];i<=r[y];i++)
{
maxt[y]=max(maxt[y],a[i]);
}
}
}
}
int ask(int ls,int rs)
{
int ans=0;
int x=belong[ls],y=belong[rs];
if(x==y)
{
for(int i=ls;i<=rs;i++)
{
ans+=a[i];
}
}
else
{
for(int i=ls;i<=r[x];i++)
{
ans+=a[i];
}
for(int i=x+1;i<=y-1;i++)
{
ans+=add[i];
}
for(int i=l[y];i<=rs;i++)
{
ans+=a[i];
}
}
return ans;
}
void update1(int place,int c)
{
int x=belong[place];
a[place]=c;
maxt[x]=add[x]=0;
for(int i=l[x];i<=r[x];i++)
{
add[x]+=a[i];
maxt[x]=max(maxt[x],a[i]);
}
}
signed main()
{
FAST_IO::read(n);
FAST_IO::read(m);
build();
while(m--)
{
int c,a,b;
FAST_IO::read(c);
FAST_IO::read(a);
FAST_IO::read(b);
if(c==2)
{
int mo;
FAST_IO::read(mo);
update(a,b,mo);
}
else if(c==1)
{
FAST_IO::writeln(ask(a,b));
}
else
{
update1(a,b);
}
}
}