红绿黑《三原色》求助(玄关)
查看原帖
红绿黑《三原色》求助(玄关)
1287433
__ycy1124__楼主2024/10/22 19:54
#include<bits/stdc++.h>
#define mid (a[p].l+a[p].r>>1)
using namespace std;
int zs[100001];
int tot,n,q;
int nex[1000001];
bool pd(int n){
	for(int j=1;j<=tot&&zs[j]*zs[j]<=n;j++){
		if(n%zs[j]==0){
			return 0;
		}
	}
	return 1;
}
set<int>s[100001];
struct Node{
	int l,r,w;
	bool bj=0;
}a[8000001];
vector<int>t[1000001];
void Push_up(int p){
	a[p].w=min(a[p*2].w,a[p*2+1].w);
	return;
}
void New_Tree(int p,int l,int r){
	a[p].l=l;
	a[p].r=r;
	a[p].w=1e9;
	if(l==r){
		return;
	}
	New_Tree(p*2,l,mid);
	New_Tree(p*2+1,mid+1,r);
}
void Find_nex(int p,int x){
	if(a[p].l==a[p].r){
		int mi=1e9;
		for(auto it:t[x]){
			mi=min(mi,*s[it].upper_bound(x));
		}
//		cout<<x<<' '<<mi<<'\n';
		a[p].w=mi;
		return;
	}
	if(mid>x){
		Find_nex(p*2,x);
	}
	else{
		Find_nex(p*2+1,x);
	}
	Push_up(p);
}
void Merge(int p,int x){
	if(a[p].l==a[p].r){
		if(a[p].bj){
			nex[x]=1e9;
			for(auto it:t[x]){
				s[it].erase(x);
				auto xx=s[it].upper_bound(x);
				if(s[it].size()<2){
					continue;
				}
				--xx;
				Find_nex(1,*xx);
			}
			a[p].w=1e9;
		}
		else{
			int mi=1e9;
			for(auto it:t[x]){
				s[it].insert(x);
				auto xx=s[it].upper_bound(x);
				mi=min(mi,*xx);
				if(s[it].size()<3){
					continue;
				}
				--xx;
				--xx;
				Find_nex(1,*xx);
			}
//			cout<<p<<'\n';
			a[p].w=mi;
		}
		a[p].bj=!a[p].bj;
		return;
	}
	if(mid<x){
		Merge(p*2+1,x);
	}
	else{
		Merge(p*2,x);
	}
	Push_up(p);
}
int Find(int p,int l,int r){
	if(a[p].l>=l&&a[p].r<=r){
		return a[p].w;
	}
	if(l>mid){
		Push_up(p);
		return Find(p*2+1,l,r);
	}
	else if(r<=mid){
		Push_up(p);
		return Find(p*2,l,r);
	}
	else{
		Push_up(p);
		return min(Find(p*2+1,l,r),Find(p*2,l,r));
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=2;i<=n;i++){
		if(pd(i)){
			zs[++tot]=i;
			s[tot].insert(1000001);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=tot&&zs[j]<=i;j++){
			if(i%zs[j]==0){
				t[i].push_back(j);
			}
		}
	}
//	cout<<zs[1]<<' '<<zs[2]<<' '<<zs[3]<<'\n';
//	for(auto it:t[4]){
//		cout<<it<<' ';
//	}
	New_Tree(1,1,n);
	for(int i=1;i<=q;i++){
		char ch;
		cin>>ch;
		if(ch=='S'){
			int x;
			cin>>x;
			Merge(1,x);
		}
		else{
			int l,r;
			cin>>l>>r;
//			cout<<Find(1,l,r)<<'\n';
			if(Find(1,l,r)<=r){
				cout<<"DA\n";
			}
			else{
				cout<<"NE\n";
			}
		}
	}
	return 0;
}
2024/10/22 19:54
加载中...