Submission #1151751

#TimeUsernameProblemLanguageResultExecution timeMemory
1151751Robert_juniorJoker (BOI20_joker)C++20
14 / 100
2095 ms20728 KiB
#include<bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define ins insert
#define pb push_back
#define F first
#define S second
const int N = 4e5+100, M = 5e5 + 7, k = 650;
const int mod = 1e9 + 7;
int pr[N], sz[N], f[N], l[N], r[N], ql[N], qr[N], ans;
bool res[N];
stack<array<int, 7>>s;
vector<array<int, 3>>query[N];
int get(int v){
    if(pr[v] == v) return v;
    else return get(pr[v]);
}
int get1(int v){
    if(pr[v] == v) return f[v];
    else return (get1(pr[v]) ^ f[v]);
}
void unite(int u, int v, bool keep){
    int a = get(u), b = get(v);
    int f1 = get1(u), f2 = (get1(v));
    if(a == b){
        if(keep) s.push({u, v, a, b, f1, f2, 0});
        if(f1 == f2) ans++;
    }
    else{
        if(sz[a] < sz[b]){
            swap(a, b);
        }
        if(keep) s.push({u, v, a, b, f1, f2, sz[b]});
        sz[a] += sz[b];
        pr[b] = a;
        sz[b] = 0;
        if(f1 == f2) f[b] ^= 1;
    }
}
void solve(){
    int n, m, q;
    cin>>n>>m>>q;
    for(int i = 1; i <= m; i++){
        cin>>l[i]>>r[i];
    }
    for(int i = 1; i <= m; i++){
        l[i + m] = l[i];
        r[i + m] = r[i];
    }
    for(int j = 1; j <= n; j++){
        sz[j] = 1;
        pr[j] = j;
        f[j] = 0;
    }
    for(int i = 1; i <= q; i++){
        cin>>ql[i]>>qr[i];
        if(m - (qr[i] - ql[i] + 1) <= k){
            for(int j = 1; j < ql[i]; j++){
                unite(l[j], r[j], 1);
            }
            for(int j = qr[i] + 1; j <= m; j++){
                unite(l[j], r[j], 1);
            }
            if(ans) res[i] = 1;
            while(s.size()){
                int u = s.top()[0];
                int v = s.top()[1];
                int a = s.top()[2];
                int b = s.top()[3];
                int f1 = s.top()[4];
                int f2 = s.top()[5];
                if(a == b){
                    if(f1 == f2) ans--;
                }
                else{
                    if(sz[a] < sz[b]){
                        swap(a, b);
                    }
                    pr[b] = b;
                    sz[b] = s.top()[6];
                    sz[a] -= s.top()[6];
                    if(f1 == f2) f[b] ^= 1;
                }
                s.pop();
            }
        }
        else{
            qr[i]++;
            ql[i] += m - 1;
            if(qr[i] >= ql[i]) continue; 
            query[qr[i] / k].pb({ql[i], qr[i], i});
        }
    }
    for(int i = 0; i < k; i++){
        if(!query[i].size()) continue;
        for(int j = 1; j <= n; j++){
            pr[j] = j;
            sz[j] = 1;
            f[j] = 0;
        }
        while(s.size()) s.pop();
        ans = 0;
        sort(all(query[i]));
        int pos = (i + 1) * k; 
        for(auto [rr, ll, idx] : query[i]){
            while(pos <= rr){
                unite(l[pos], r[pos], 0);
                pos++;
            }
            int cur = (i + 1) * k - 1;
            while(cur >= ll){
                unite(l[cur], r[cur], 1);
                cur--;
            }
            if(ans > 0) res[idx] = 1;
            while(s.size()){
                int u = s.top()[0];
                int v = s.top()[1];
                int a = s.top()[2];
                int b = s.top()[3];
                int f1 = s.top()[4];
                int f2 = s.top()[5];
                if(a == b){
                    if(f1 == f2) ans--;
                }
                else{
                    if(sz[a] < sz[b]){
                        swap(a, b);
                    }
                    pr[b] = b;
                    sz[b] = s.top()[6];
                    sz[a] -= s.top()[6];
                    if(f1 == f2) f[b] ^= 1;
                }
                s.pop();
            }
        }
    }
    for(int i = 1; i <= q; i++){
        if(res[i]) cout<<"YES\n";
        else cout<<"NO\n";
    }
}
main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //cin>>t; 
    for(int i = 1; i <= t; i++){
        //cout<<"Case "<<i<<": ";
        solve();
    }
}

Compilation message (stderr)

Joker.cpp:144:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  144 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...