!外星人使用大肠导致南极冰山融化,致我的P9989线段树代码变异WA了,求调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/7/31 20:01
  • 上次更新2024/7/31 21:22:44
查看原帖
!外星人使用大肠导致南极冰山融化,致我的P9989线段树代码变异WA了,求调
895435
Zq_water楼主2024/7/31 20:01

rt

#include<bits/stdc++.h>
using namespace std;
#define int __int128
const int maxn = 2e5+5;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}

int n,m,a[maxn];
struct Tree{int l,r,sum,lcm;}t[maxn<<2];

void pushup(int u){
	t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
	t[u].lcm=min((int)2e18,t[u<<1].lcm*t[u<<1|1].lcm/__gcd(t[u<<1].lcm,t[u<<1|1].lcm));
}
void build(int u,int l,int r){
	t[u].l=l,t[u].r=r;
	if(l==r){t[u].sum=t[u].lcm=a[l];return;}
	int mid=l+r>>1;
	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify(int u,int l,int r,int x){
	if(!(x%t[u].lcm))return;
	if(t[u].l==t[u].r){t[u].sum=t[u].lcm=__gcd(t[u].lcm,x);return;}
	int mid=t[u].l+t[u].r>>1;
	if(l<=mid)modify(u<<1,l,r,x);
	if(r>mid)modify(u<<1|1,l,r,x);
	pushup(u);
}
long long query(int u,int l,int r){
	if(l<=t[u].l&&t[u].r<=r)return t[u].sum;
	long long res=0,mid=t[u].l+t[u].r>>1;
	if(l<=mid)res+=query(u<<1,l,r);
	if(r>mid)res+=query(u<<1|1,l,r);
	return res;
}

signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	for(int i=1,op,l,r,x;i<=m;i++){
		op=read();
		if(op==1)l=read(),r=read(),x=read(),modify(1,l,r,x);
		else l=read(),r=read(),printf("%lld\n",query(1,l,r));
	}
	return 0;
}
2024/7/31 20:01
加载中...