Submission #957196

#TimeUsernameProblemLanguageResultExecution timeMemory
957196vjudge1Radio (COCI22_radio)C++17
110 / 110
1413 ms200368 KiB
#include<bits/stdc++.h>
using namespace std;
#define LL int
LL n,i,j,k,m,l,r,x,useless;
LL tree[4000005];
LL a[1000005][12];
set<LL> st[1000005];
set<LL,greater<LL> > st1[1000005];
char ch;
bool flag[1000005];
const LL inf=0x7fffffff;
void insert(LL l,LL r,LL id,LL x,LL val){
	if(l==r && r==x){
		tree[id]=val;
		return ;
	}
	LL mid=(l+r)>>1;
	if(x<=mid) insert(l,mid,id*2,x,val);
	else insert(mid+1,r,id*2+1,x,val);
	tree[id]=min(tree[id*2],tree[id*2+1]);
}
LL query(LL l,LL r,LL id,LL askl,LL askr){
	if(l>=askl && r<=askr){
		return tree[id];
	}
	LL mid=(l+r)>>1,minx=inf;
	if(askl<=mid) minx=min(minx,query(l,mid,id*2,askl,askr));
	if(askr>mid) minx=min(minx,query(mid+1,r,id*2+1,askl,askr));
	return minx;
}
void update(LL x){
	LL num=inf;
	for(LL i=1;i<=a[x][0];i++){
		auto tmp=st[a[x][i]].upper_bound(x);
		if(tmp!=st[a[x][i]].end()) num=min(num,*tmp);
	}
	//printf("%lld %lld\n",x,num);
	insert(1,n,1,x,num);
}
LL read(){
	useless=0;
	while(ch<'0' || ch>'9') ch=getchar();
	while(ch>='0' && ch<='9'){
		useless=useless*10+ch-'0';
		ch=getchar();
	}
	return useless;
}
int main(){
	ios::sync_with_stdio(false);
	memset(tree,0x7f,sizeof(tree));
	cin>>n>>m;
	for(i=2;i<=n;i++){
		if(a[i][0]==0){
			for(j=1;i*j<=n;j++){
				a[i*j][0]++;
				a[i*j][a[i*j][0]]=i;
			}
		}
	}
	for(i=1;i<=m;i++){
	    cin>>ch;
		if(ch=='S'){
			cin>>x;
			if(flag[x]==false){
				flag[x]=true;
				update(x);
				for(j=1;j<=a[x][0];j++){
					st[a[x][j]].insert(x);
					st1[a[x][j]].insert(x);
				}
				for(j=1;j<=a[x][0];j++){
					auto tmp=st1[a[x][j]].upper_bound(x);
					if(tmp!=st1[a[x][j]].end()) update(*tmp);
				}
			}
			else{
				flag[x]=false;
				insert(1,n,1,x,inf);
				for(j=1;j<=a[x][0];j++){
					st[a[x][j]].erase(x);
					st1[a[x][j]].erase(x);
				}	
				for(j=1;j<=a[x][0];j++){
					auto tmp=st1[a[x][j]].upper_bound(x);
					if(tmp!=st1[a[x][j]].end()) update(*tmp);
				}
			}
		}
		else{
			cin>>l>>r;
			if(query(1,n,1,l,r)<=r) printf("DA\n");
			else printf("NE\n");
		}
	} 
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...