제출 #1330422

#제출 시각아이디문제언어결과실행 시간메모리
1330422secondaccountmaybeRadio (COCI22_radio)C++20
110 / 110
719 ms111784 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll m=1<<20;
ll s[m],n,q;
bool o[m];
set<ll>t[m];
ll g[2*m][2];
void f(){
	for(ll i=2;i<m;i++)
	{
		if(s[i]==0)
		{
			for(ll j=i;j<m;j+=i)
			{
				s[j]=i;
			}
		}
	}
}
void u(ll i,ll l,ll r)
{
	i+=m;
	g[i][0]=l;
	g[i][1]=r;
	for(i/=2;i>0;i/=2)
	{
		g[i][0]=max(g[2*i][0],g[2*i+1][0]);
		g[i][1]=min(g[2*i][1],g[2*i+1][1]);
	}
}
pair<ll,ll>qy(ll l,ll r,ll x=1,ll a=0,ll b=m-1)
{
	if(l>b||r<a)
	{
		return{-1,m};
	}
	if(l<=a&&b<=r)
	{
		return{g[x][0],g[x][1]};
	}
	pair<ll,ll>c=qy(l,r,2*x,a,a+(b-a)/2);
	pair<ll,ll>d=qy(l,r,2*x+1,a+(b-a)/2+1,b);
	return
	{
	  max(c.first,d.first),min(c.second,d.second)
	};
}
void fx(ll x)
{
	ll l=-1,r=m;
	for(ll p=s[x],v=x;v!=1;)
	{
		auto& z=t[p];
		auto i=z.lower_bound(x);
		if(i!=z.begin())
		{
			i--;
			l=max(l,*i);
		}
		auto j=z.upper_bound(x);
		if(j!=z.end())
		{
			r=min(r,*j);
		}
		while(v%p==0)
		{
			v/=p;
		}
		p=s[v];
	}
	u(x,l,r);
}
void sw(ll x){
	if(x==1)
	{
		return;
	}
	vector<ll> c;
	ll l=-1,r=m;
	for(ll p=s[x],v=x;v!=1;)
	{
		auto& z=t[p];
		auto i=z.lower_bound(x);
		if(i!=z.begin())
		{
			i--;
			if(!o[x]&&g[m+*i][1]>x)
			{
				u(*i,g[m+*i][0],x);
			}
			else if(o[x]&&g[m+*i][1]==x)
			{
				c.push_back(*i);
			}
			l=max(*i,l);
		}
		auto j=z.upper_bound(x);
		if(j!=z.end())
		{
			if(!o[x]&&g[m+*j][0]<x)
			{
				u(*j,x,g[m+*j][1]);
			}
			else if(o[x]&&g[m+*j][0]==x)
			{
				c.push_back(*j);
			}
			r=min(*j,r);
		}
		if(!o[x])
		{
			z.insert(x);
		}
		else
		{
			z.erase(x);
		}
		while(v%p==0)
		{
			v/=p;
		}
		p=s[v];
	}
	if(o[x])
	{
		u(x,-1,m);
		o[x]=false;
	}
	else
	{
		u(x,l,r);
		o[x]=true;
	}
	sort(c.begin(),c.end());
	c.erase(unique(c.begin(),c.end()),c.end());
	for(ll i:c)
	{
		fx(i);
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	f();
	for(ll i=0;i<2*m;i++)
	{
		g[i][0]=-1;
		g[i][1]=m;
	}
	cin>>n>>q;
	while(q--)
	{
		string a;
		cin>>a;
		if(a[0]=='S')
		{
			ll x;
			cin>>x;
			sw(x);
		}
		else
		{
			ll l,r;
			cin>>l>>r;
			pair<ll,ll>x=qy(l,r);
			if(x.first>=l||x.second<=r)
			{
				cout<<"DA"<<endl;
			}
			else
			{
				cout<<"NE"<<endl;
			}
		}
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...