#4 RE 求助
查看原帖
#4 RE 求助
174806
xbb2楼主2022/8/27 21:01
/*	Name:CF438D
	Copyright:[Xcoi]
	Author:xbb2
	Date:2022.8.27
	Description:*/
#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+10;
//const long long mod;
const long long inf=309133584;
long long a[N];
struct tree{
	long long d[N>>2],maxx[N>>2];
	inline void build(long long s,long long t,long long p) {
		if(s==t){d[p]=maxx[p]=a[s];return ;}
		long long 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]);
	}
	inline void update(long long x,long long c,long long s,long long t,long long p){
		if(s==t&&s==x){d[p]=maxx[p]=c;return ;}
		long long m=((s+t)>>1);
		if(x<=m)update(x,c,s,m,p*2);
		if(m<x)	update(x,c,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]);
	}
	inline void update_mod(long long l,long long r,long long mod,long long s,long long t,long long p){
		if(l<=s&&t<=r){
			if(maxx[p]<mod)return ;
			d[p]%=mod;
			maxx[p]%=mod;
			if(s==t)return ;
		}
		long long m=((s+t)>>1);
		if(l<=m)update_mod(l,r,mod,s,m,p*2);
		if(m<r)	update_mod(l,r,mod,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]);
	}
	inline long long query(long long l,long long r,long long s,long long t,long long p){
		if(l<=s&&t<=r)return d[p];
		long long m=((s+t)>>1),ans=0;
		if(l<=m)ans+=query(l,r,s,m,p*2);
		if(m<r)	ans+=query(l,r,m+1,t,p*2+1);
		return ans;
	}
}T;
long long n,m;
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m;
	for(long long i=1;i<=n;i++) scanf("%lld",&a[i]);
	T.build(1,n,1);
	for(long long i=1;i<=m;i++) {
		long long opt,l,r,x;scanf("%lld%lld%lld",&opt,&l,&r);
		if(opt==1)
			printf("%lld\n",T.query(l,r,1,n,1));
		if(opt==2)
			scanf("%lld",&x),T.update_mod(l,r,x,1,n,1);
		if(opt==3)
			T.update(l,r,1,n,1);
	}
	return 0;
}

RT

2022/8/27 21:01
加载中...