Why UNAC?
查看原帖
Why UNAC?
575655
Chtholly_is_cute楼主2024/10/26 09:12

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500050,M=100050;
#define pii pair<int,int>
ll tr[N<<2],t[N<<2],a[N],k;
int n,m;
char ch;
int lowbit(int x){return x&(-x);}
void add(int x,ll y){
	while(x<=n){
		t[x]+=y;
		x+=lowbit(x);
	}
}
ll query(int x){
	ll sum=0;
	while(x){
		sum+=t[x];
		x^=lowbit(x);
	}return sum;
}
void range_gcd(int ind,int l,int r){
	if(l==r){
		add(l,a[r]-a[l-1]);
		return;
	}
	int mid=(l+r)/2,lf=ind<<1,rf=lf|1;
	range_gcd(lf,l,mid);
	range_gcd(rf,mid+1,r);
	tr[ind]=__gcd(__gcd(tr[lf],tr[rf]),abs(query(mid+1)-query(mid)));
}
void range_add(int x,int l,int r,int ll,int rr){
	if(l==ll&&r==rr){
		add(l,k);
		add(r+1,-k);
		return;
	}
	int mid=l+r>>1,lf=x<<1,rf=lf|1;
	if(rr<=mid)range_add(lf,l,mid,ll,rr);
	else if(ll>mid)range_add(rf,mid+1,r,ll,rr);
	else
		range_add(lf,l,mid,ll,mid),
		range_add(rf,mid+1,r,mid+1,rr);
	tr[x]=__gcd(__gcd(tr[lf],tr[rf]),abs(query(mid+1)-query(mid)));
}
ll rgcd(int x,int l,int r,int L,int R){
	if(l==L&&r==R){
		return __gcd(abs(query(l)),tr[x]);
	}
	int mid=(l+r)/2,lf=x<<1,rf=lf|1;
	if(R<=mid){
		return rgcd(lf,l,mid,L,R);
	}else if(L>mid)
		return rgcd(rf,mid+1,r,L,R);
	else
		return __gcd(__gcd(rgcd(lf,l,mid,L,mid),
		       rgcd(rf,mid+1,r,mid+1,R)),abs(query(mid+1)-query(mid)));
}
int main(){
	cin>>n>>m;
	int l,r;
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
	}
	range_gcd(1,1,n);
	while(m--){
		cin>>ch>>l>>r;
		if(ch=='C'){
			cin>>k;
			range_add(1,1,n,l,r);
		}
		else{
			cout<<rgcd(1,1,n,l,r)<<endl;
		}
	}
}
2024/10/26 09:12
加载中...