诸葛亮观星给我两张RE,导致我的P9989代码50分RE了,求大佬调
  • 板块灌水区
  • 楼主弓子瑞2011
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/2 07:40
  • 上次更新2024/8/2 09:57:44
查看原帖
诸葛亮观星给我两张RE,导致我的P9989代码50分RE了,求大佬调
537639
弓子瑞2011楼主2024/8/2 07:40

rt

#include <bits/stdc++.h>
#define int __int128
using namespace std;
const int maxn=2e5+5,mod=4294967296;
int n,q,a[maxn];
struct tree{
	int l,r,sum,lcm;
}tr[maxn<<2];
int read(){
    int s=0,w=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') w=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        s=(s<<3)+(s<<1)+(c^48);
        c=getchar();
    }
    return s*w;
}
void write(int x){
    if(x<0){
        putchar('-');
        x=~x+1;
    }
    if(x>=10) write(x/10);
    putchar(x%10+'0');
    return;
}
__int128 lcm(int x,int y){
	__int128 z=x*y/__gcd(x,y);
	return z%mod;
}
void pushup(int p){
	tr[p].lcm=lcm(tr[p<<1].lcm,tr[p<<1|1].lcm);
	tr[p].sum=(tr[p<<1].sum+tr[p<<1|1].sum)%mod;
}
void build(int p,int l,int r){
	tr[p].l=l;
	tr[p].r=r;
	if(l==r){
		tr[p].sum=tr[p].lcm=a[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void quxiu(int p,int l,int r,int x){
	if(x%tr[p].lcm==0) return;
	if(tr[p].l==tr[p].r){
		tr[p].lcm=__gcd(tr[p].lcm,x);
		tr[p].sum=tr[p].lcm%mod;
		return;
	}
	int mid=tr[p].l+tr[p].r>>1;
	if(l<=mid) quxiu(p<<1,l,r,x);
	if(r>mid) quxiu(p<<1|1,l,r,x);
	pushup(p);
}
int qucha(int p,int l,int r){
	if(l<=tr[p].l&&r>=tr[p].r) return tr[p].sum;
	int mid=tr[p].l+tr[p].r>>1,ans=0;
	if(l<=mid) (ans+=qucha(p<<1,l,r))%=mod;
	if(r>mid) (ans+=qucha(p<<1|1,l,r))%=mod;
	return ans;
}
signed main(){
	n=read();
	q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while(q--){
		int op;
		op=read();
		if(op==1){
			int l,r,x;
			l=read();
			r=read();
			x=read();
			quxiu(1,l,r,x);
		}
		else{
			int l,r;
			l=read();
			r=read();
			write(qucha(1,l,r)%mod);
			puts("");
		}
	}
	return 0;
}
2024/8/2 07:40
加载中...