0pts求条
查看原帖
0pts求条
1460688
guoxinda楼主2025/6/29 13:06
#include<bits/stdc++.h>
using namespace std; 
#define int long long
struct stu{
	int x,y,w,ww;
}t[4000010];
int n,q,a[8000010],b[8000010],mp[8000010],la[8000010],d,e,kw,xx,yy;
char c;
bool check(int l1,int r1,int l2,int r2){
	return !(l2>r1||r2<l1);
}
bool chk(int l1,int r1,int l2,int r2){
	return l1<=l2&&r1>=r2;
}
void dfs(int l,int r,int h){
	if(l>r)return ;
	t[h].x=l,t[h].y=r;
	if(l==r){
		t[h].w=abs(b[l]);
		t[h].ww=b[l];
		mp[l]=h;
		return ;
	}
	dfs(l,(l+r)/2,h*2);
	dfs((l+r)/2+1,r,h*2+1);	
	t[h].w=__gcd(abs(t[h*2].w),abs(t[h*2+1].w));
	t[h].ww=t[h*2].ww+t[h*2+1].ww;
}
void ch2(int h,int x,int y){
	if(!check(x,y,t[h].x,t[h].y))return ;
	if(t[h].x==t[h].y&&check(x,y,t[h].x,t[h].y)){
		t[h].w+=kw;
		t[h].ww=t[h].w;
		return ;
	}
	ch2(h*2,x,y);
	ch2(h*2+1,x,y);
	t[h].w=__gcd(abs(t[h*2].w),abs(t[h*2+1].w));
	t[h].ww=t[h*2].ww+t[h*2+1].ww;
}
int ch(int h,int x,int y){
	if(!check(x,y,t[h].x,t[h].y))return 0;
	if(chk(x,y,t[h].x,t[h].y)){
		return abs(t[h].w);
	}
	int ans=0;
	ans=__gcd(abs(ans),abs(ch(h*2,x,y)));
	ans=__gcd(abs(ans),abs(ch(h*2+1,x,y)));
	return ans;
}
int ch3(int h,int x,int y){
	if(!check(x,y,t[h].x,t[h].y))return 0;
	if(check(x,y,t[h].x,t[h].y)){
		return t[h].ww;
	}
	int ans=0;
	ans+=ch3(h*2,x,y);
	ans+=ch3(h*2+1,x,y);
	return ans;
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i]-a[i-1];
	dfs(1,n,1);
	for(int i=1;i<=q;i++){
		cin>>c>>d>>e;
		if(c=='C'){
			cin>>kw;
			ch2(1,d,d);
			kw=-kw;
			if(e<n)ch2(1,e+1,e+1);
		}else{
			cout<<abs(__gcd(ch3(1,1,d),abs(ch(1,d+1,e))))<<endl;
		}
	}
	return 0;
}

被老师盖飞了:“你这个线段树重写一下吧。”

2025/6/29 13:06
加载中...