Submission #1319033

#TimeUsernameProblemLanguageResultExecution timeMemory
1319033nguyenkhangninh99Radio (COCI22_radio)C++20
110 / 110
702 ms188408 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e6 + 5;
const int INF=1e18;
int n, q;
int spf[maxn], pid[maxn], cnt_p = 0;
multiset<int> adj[maxn], pos[maxn];
int t[4 * maxn], on[maxn];
void sieve(){
	for(int i=1;i<maxn;i++) spf[i]=i;
	for(int i=2;i*i<maxn;i++){
		if(spf[i]==i){
			for(int j=i*i;j<maxn;j+=i)
				if(spf[j]==j) spf[j]=i;
		}
	}
	for(int i=2;i<maxn;i++) if(spf[i]==i) pid[i]=++cnt_p;
}
void upd(int v,int tl,int tr,int p,int val){
	if(tl==tr) t[v]=val;
	else{
		int tm=(tl+tr)/2;
		if(p<=tm) upd(2*v,tl,tm,p,val);
		else upd(2*v+1,tm+1,tr,p,val);
		t[v]=min(t[2*v],t[2*v+1]);
	}
}
int get(int v,int tl,int tr,int l,int r){
	if(l>r) return INF;
	if(l==tl&&r==tr) return t[v];
	int tm=(tl+tr)/2;
	return min(get(2*v,tl,tm,l,min(r,tm)),get(2*v+1,tm+1,tr,max(l,tm+1),r));
}
int getmn(int u){
	if(adj[u].empty()) return INF;
	else return *adj[u].begin();
}
void add_val(int u,int v){
	adj[u].insert(v);
	upd(1, 1, n, u, getmn(u));
}
void rem_val(int u, int v){
    adj[u].erase(adj[u].find(v));
	upd(1, 1, n, u, getmn(u));
}
signed main(){
	ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

	sieve();
	cin >> n >> q;
	fill(t, t + 4 * maxn, INF);
	while(q--){
		char type; cin >> type;
		if(type == 'S'){
			int x; cin >> x;
			vector<int> pr;
            int tmp = x;
            while(tmp > 1){
                int p = spf[tmp];
                pr.push_back(p);
                while(tmp % p == 0) tmp /= p;
            }
			if(on[x]){
				on[x] = 0;
				for(int p:pr){
					int id=pid[p];
					auto it=pos[id].find(x);
					int L=-1,R=-1;
					if(it!=pos[id].begin()) L=*prev(it);
					if(next(it)!=pos[id].end()) R=*next(it);
					pos[id].erase(it);
					if(L!=-1){
						rem_val(L,x);
						if(R!=-1) add_val(L,R);
					}
				}
				adj[x].clear();
				upd(1,1,n,x,INF);
			}else{
				on[x]=1;
				for(int p:pr){
					int id=pid[p];
					pos[id].insert(x);
					auto it=pos[id].find(x);
					int L=-1,R=-1;
					if(it!=pos[id].begin()) L=*prev(it);
					if(next(it)!=pos[id].end()) R=*next(it);
					if(L!=-1){
						if(R!=-1) rem_val(L,R);
						add_val(L,x);
					}
					if(R!=-1) adj[x].insert(R);
				}
				upd(1,1,n,x,getmn(x));
			}
		}else{
			int l, r; cin >> l >> r;
			cout << (get(1, 1, n, l, r) <= r ? "DA" : "NE") << "\n";
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...