TLE壶关求调!!!
查看原帖
TLE壶关求调!!!
867511
Jason0322楼主2024/11/8 21:15
#include<bits/stdc++.h>
# define ll long long
#define lson(x) x<<1
#define rson(x) x<<1|1
using namespace std;
const ll maxn=5e5+9;
ll n,m;
ll a[maxn];
struct node{
	ll gcd,sum;
}tree[4*maxn];
inline void biuld(ll rt,ll l,ll r){
	if(l==r){
		return tree[rt].sum=tree[rt].gcd=a[l]-a[l-1],void();
		return;
	}
	ll mid=l+r>>1;
	biuld(lson(rt),l,mid);
	biuld(rson(rt),mid+1,r);
	tree[rt].sum=tree[lson(rt)].sum+tree[rson(rt)].sum;
	tree[rt].gcd=__gcd(tree[lson(rt)].gcd,tree[rson(rt)].gcd);
}
inline void ch(ll rt,ll l,ll r,ll x,ll z){
	if(x==r&&l==x){
		tree[rt].gcd=tree[rt].sum=tree[rt].sum+z;
		return ;
	}
	ll mid=l+r>>1;
	if(x<=mid){
		ch(lson(rt),l,mid,x,z);
	}else{
		ch(rson(rt),mid+1,r,x,z);
	}
	tree[rt].sum=tree[lson(rt)].sum+tree[rson(rt)].sum;
	tree[rt].gcd=__gcd(tree[lson(rt)].gcd,tree[rson(rt)].gcd);
}
inline node qq(ll rt,ll l,ll r,ll x,ll y){
	if(l>r){
		return {0}; 
	}
	if(l>=x&&y>=r){
		return tree[rt];
	}
	ll mid=l+r>>1;
	if(y<=mid){
		return qq(lson(rt),l,mid,x,y);
	}else if(x>mid){
		return qq(rson(rt),mid+1,r,x,y);
	}else{
		node tmp,left=qq(lson(rt),l,mid,x,y),right=qq(rson(rt),mid+1,r,x,y);
		tmp.sum=left.sum+right.sum;
		tmp.gcd=__gcd(left.gcd,right.gcd);
		return tmp;
	}
}
int main(){
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		cin>>a[i];
	}
	biuld(1ll,1ll,n);
	char op;
	ll x,y,z;
	while(m--){
		cin>>op;
		if(op=='C'){
			scanf("%lld%lld%lld",&x,&y,&z);
			ch(1,1,n,x,z);
			if(y<n){
				ch(1,1,n,y+1,-z);
			}
		}else{
			scanf("%lld%lld",&x,&y);
			cout<<abs(__gcd(qq(1,1,n,1,x).sum,qq(1,1,n,x+1,y).gcd))<<endl;
		}
	}
	return 0;
}
2024/11/8 21:15
加载中...