蒟蒻UKE求助
查看原帖
蒟蒻UKE求助
1011275
Glass_S楼主2023/9/21 21:52

不知道哪里错了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;
}
2023/9/21 21:52
加载中...