제출 #1184051

#제출 시각아이디문제언어결과실행 시간메모리
1184051al95ireyizRadio (COCI22_radio)C++20
110 / 110
1458 ms221628 KiB
//*** Bismillah ***//
// It's the evening of another day. And the end of mine...
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#if !defined(ONLINE_JUDGE) and !defined(EVAL)
#include "template/debug.h"
#else
#define d(x...)
#endif
#define ll long long
const ll INF = 1e9;
const ll INFL = 1e18;
const ll MOD = 1e9 + 7;
const ll maxn = 1e6 + 5;
ll n,m,k=0;
#define fr first
#define sc second
#define st pair<ll, vector<ll>>
st tree[4*maxn], val;
st merge(st a, st b){
    if(a.fr or b.fr) return {1, {}};
    ll can = 0;
    vector<ll>&x = a.sc;
    vector<ll>&y = b.sc;
    ll l1 = x.size(), l2 = y.size();
    ll i = 0, j = 0;
    vector<ll>z;
    while(i < l1 or j < l2){
        if(i == l1) z.push_back(y[j++]);
        else if(j == l2) z.push_back(x[i++]);
        else{
            if(x[i] < y[j]) z.push_back(x[i++]);
            else if(x[i] > y[j]) z.push_back(y[j++]);
            else{
                can = 1;
                break;
            }
        }
    }
    if(can) return {1, {}};
    else return {0, z};
}
void upd(ll &x, ll l=1, ll r=n, ll v=1){
    if(l == r){
        tree[v] = val;
        return;
    }
    ll md = (l+r)>>1;
    if(x <= md) upd(x, l, md, v<<1);
    else upd(x, md+1, r, v<<1|1);
    tree[v] = merge(tree[v<<1], tree[v<<1|1]);
}
st get(ll _l, ll _r, ll l=1, ll r=n, ll v=1){
    bool in = _l <= l and r <= _r;
    bool ot = _l <= r and l <= _r;
    if(in){
        return tree[v];
    }
    if(ot){
        ll md = (l+r)>>1;
        return merge(
            get(_l, _r, l, md, v<<1),
            get(_l, _r, md+1, r, v<<1|1)
        );
    }
    return {0, {}};
}
vector<ll>mp[maxn];
ll open[maxn];
void _(){
    cin>>n>>m;
    for(ll i=2;i<=n;i++){
        if(!mp[i].empty()) continue;
        for(ll j=i;j<=n;j+=i){
            mp[j].push_back(i);
        }
    }
    char c;
    for(ll i=0;i<m;i++){
        cin>>c;
        if(c == 'S'){
            ll x;
            cin>>x;
            if(!open[x]){
                val = {0, mp[x]};
                upd(x);
                open[x] = 1;
            }
            else{
                val = {0, {}};
                upd(x);
                open[x] = 0;
            }
        }
        else{
            ll l, r;
            cin>>l>>r;
            cout<<(get(l, r).fr ? "DA\n" : "NE\n");
        }
    }  
}
signed main(){
    auto testcaseruntime=clock();
    cin.tie(0)->sync_with_stdio(0);
    ll t=1;
    // cin>>t;
    while(t--){
        _();
    }
    cerr<<"\n\033[1;31mTime: \033[1;30m"
        <<(double)(clock()-testcaseruntime)/1000000<<"\033[1;32m seconds\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...