제출 #1148281

#제출 시각아이디문제언어결과실행 시간메모리
1148281byunjaewooJoker (BOI20_joker)C++20
0 / 100
2095 ms42892 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=200010;
int n, m, q, u[N], v[N], p[N];
int flag, g[N], c[N];
vector<vector<array<int, 3>>> vec;
vector<int> com[N], vec2;

int Find(int x) { return (g[x]>=0)?(g[x]=Find(g[x])):x; }
void Union(int u, int v) {
    int uu=Find(u), vv=Find(v);
    if(uu==vv) {
        vec.push_back({}), vec2.push_back(flag);
        if(c[u]==c[v]) flag=true;
        return;
    }
    vector<array<int, 3>> tmp;
    vec2.push_back(flag);
    if(-g[uu]>-g[vv]) swap(uu, vv);
    if(c[u]==c[v]) {
        for(int i:com[uu]) tmp.push_back({0, i, c[i]}), c[i]=1-c[i];
    }
    for(int i:com[uu]) tmp.push_back({2, uu, vv}), com[vv].push_back(i);
    com[uu].clear();
    tmp.push_back({1, uu, g[uu]}), tmp.push_back({1, vv, g[vv]});
    g[vv]+=g[uu], g[uu]=vv;
    vec.push_back(tmp);
}
void RollBack(int cnt) {
    while(cnt--) {
        flag=vec2.back();
        for(auto [op, x, y]:vec.back()) {
            if(op==0) c[x]=y;
            else if(op==1) g[x]=y;
            else com[x].push_back({com[y].back()}), com[y].pop_back();
        }
        vec.pop_back(), vec2.pop_back();
    }
}

void F(int l, int r, int s, int e) {
    if(l>r) return;
    int mid=(l+r)/2, cnt=0;
    for(int i=l; i<mid; i++) Union(u[i], v[i]), cnt++;
    for(int i=e; i>=max(s, mid); i--) {
        if(flag) {
            p[mid]=i; break;
        }
        Union(u[i], v[i]), cnt++;
    }
    if(!p[mid]) {
        RollBack(cnt), cnt=0;
        //for(int i=e; i>=mid; i--) Union(u[i], v[i]), cnt++;
        //F(l, mid-1, s, min(e, mid-1));
        F(l, mid-1, s, e);
        //RollBack(cnt), cnt=0;
        for(int i=l; i<mid; i++) Union(u[i], v[i]), cnt++;
        //F(mid+1, r, max(s, mid+1), e);
        F(mid+1, r, s, e);
        RollBack(cnt);
    }
    else {
        RollBack(cnt), cnt=0;
        //for(int i=e; i>=p[mid]+1; i--) Union(u[i], v[i]), cnt++;
        //F(l, mid-1, s, p[mid]);
        F(l, mid-1, s, e);
        //RollBack(cnt), cnt=0;
        for(int i=l; i<=mid; i++) Union(u[i], v[i]), cnt++;
        //F(mid+1, r, p[mid], e);
        F(mid+1, r, s, e);
        RollBack(cnt);
    }
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m>>q;
    for(int i=1; i<=m; i++) cin>>u[i]>>v[i];
    fill(g+1, g+n+1, -1);
    for(int i=1; i<=n; i++) com[i].push_back(i);
    F(1, m, 1, m);
    while(q--) {
        int l, r; cin>>l>>r;
        if(r<=p[l]) cout<<"YES\n";
        else cout<<"NO\n";
    }
    return 0;
}
#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...