Submission #1156376

#TimeUsernameProblemLanguageResultExecution timeMemory
1156376AHOKARadio (COCI22_radio)C++20
110 / 110
783 ms199112 KiB
#pragma GCC optimize("O3") 
#pragma GCC target("sse4")

#include <bits/stdc++.h>

using namespace std;
 
#define threesum cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false)
#define all(a) a.begin(), a.end()
#define F first
#define S second
//#define int long long
#define pii pair<int, int>
#define ppp pair<int, pii>
#define dout cout << fixed << setprecision(15)
#define mid ((l + r) / 2)
#define lc (2 * id)
#define rc (lc + 1)

const int maxn = 1e6 + 10, maxm = 7e2 + 10, oo = 1e9 + 10, lg = 33, sq = 350, mod = 998244353;

int n, m;
set<pii> a[maxn];

vector<int> p[maxn];
set<int> ind[maxn];

int mx[maxn << 2];

void sieve(){
    for (int i = 2; i < maxn;i++)
        if(!p[i].size())
            for (int j = i; j < maxn; j += i)
                p[j].push_back(i);
}

void merge(int id){
    mx[id] = max(mx[lc], mx[rc]);
}

void build(int id = 1, int l = 1, int r = n + 1){
    if (r - l == 1)
    {
        mx[id] = -oo;
        return;
    }

    build(lc, l, mid);
    build(rc, mid, r);

    merge(id);
}

void updmx(int i, int v, int d, int id = 1, int l = 1, int r = n + 1){
    if(r - l == 1){
        a[l].insert({v, d});
        mx[id] = (*a[l].rbegin()).F;
        return;
    }

    if(i < mid)
        updmx(i, v, d, lc, l, mid);
    else 
        updmx(i, v, d, rc, mid, r);

    merge(id);
}

int getmx(int ql, int qr, int id = 1, int l = 1, int r = n + 1){
    if(r <= ql || qr <= l)
        return -oo;
    
    if(ql <= l && r <= qr)
        return mx[id];

    return max(getmx(ql, qr, lc, l, mid), getmx(ql, qr, rc, mid, r));
}

void upd(int x){
    bool f = 0;

    for (auto i : p[x])
    {
        if(!ind[i].size()){
            ind[i].insert(x);
            continue;
        }

        auto it = ind[i].lower_bound(x);

        if(it != ind[i].end()){
            if(*it == x){
                f = 1;

                auto nxt = it;
                nxt++;

                if(nxt != ind[i].end()){
                    a[*nxt].erase({x, i});

                    if(it != ind[i].begin()){
                        auto prv = it;
                        prv--;
                        
                        updmx(*nxt, *prv, i);
                    }
                    else
                        updmx(*nxt, -oo, i);
                }

                ind[i].erase(x);
            }
            else{
                if(it != ind[i].begin()){
                    auto prv = it;
                    prv--;
                    
                    a[*it].erase({*prv, i});

                    updmx(x, *prv, i);
                }

                updmx(*it, x, i);

                ind[i].insert(x);
            }
        }
        else{
            auto prv = it;
            prv--;

            updmx(x, *prv, i);

            ind[i].insert(x);
        }
    }

    if(f){
        a[x].clear();
        for (auto i : p[x])
            updmx(x, -oo, i);
    }
}

signed main()
{
    threesum;

    sieve();

    cin >> n >> m;

    build();

    while(m--){
        char c;
        cin >> c;
        if(c == 'S'){
            int x;
            cin >> x;
            upd(x);
        }
        else{
            int l, r;
            cin >> l >> r;
            r++;

            if(l <= getmx(l, r))
                cout << "DA\n";
            else
                cout << "NE\n";
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...