제출 #1337889

#제출 시각아이디문제언어결과실행 시간메모리
1337889azra_gonulJoker (BOI20_joker)C++20
36 / 100
2092 ms18032 KiB
#include"bits/stdc++.h"
using namespace std;
const int nMax = 2e5 + 7;

long long cnt = 0;
bool ans[nMax];
long long smL[nMax];
long long rnk[nMax];
long long eq[nMax];
long long par[nMax];
stack <pair <long long , long long > > st;
long long int sH = 50;
bool comp(array<long long ,4> x,array<long long,4> y)
{
    if(x[3]/sH == y[3]/sH)
        return x[1] > y[1];
 
 
    return y[3]/sH > x[3]/sH;
}
pair <long long , long long> findPar(long long a, long long tmp){
    if(par[a] == a){
        tmp = (tmp ^ eq[a]);
        return make_pair(a , tmp);
    }
    return findPar(par[a] , tmp ^ eq[a]);
}

bool uni(long long a , long long b){
    pair <long long , long long> fr = findPar(a , 0);
    pair <long long , long long> sec = findPar(b , 0);

    //cout << a << " " << b << " "<< fr.first << " " << sec.first << "\n";
    if(fr.first == sec.first){
        if(fr.second == sec.second){
            st.push(make_pair(-1 , cnt));
            cnt++;
            return false;
        }
        return true;
    }
    a = fr.first;
    b = sec.first;
    if(rnk[a] > rnk[b]){
        swap(a , b);
    }
    st.push(make_pair(a , -1));
    rnk[b] += rnk[a];
    eq[a] = 0;
    if(fr.second == sec.second){
        eq[a] = 1;
    }
    par[a] = b;

    return true;
}
void rollback(int sz){
    while(st.size() > sz){
        long long piv = st.top().first;
        if(piv == -1){
            cnt = st.top().second;
            st.pop();
            continue;
        }
        eq[piv] = 0;
        rnk[par[piv]] -= rnk[piv];
        par[piv] = piv;
        st.pop();
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    long long n , m , q , l , r;
    vector <array <long long , 2> > edges;
    array <long long , 2> tmp;
    cin >> n >> m >> q;
    sH = sqrt(q);
    for(long long i = 1; n >= i; i++){
        rnk[i] = 1;
        par[i] = i;
    }
    tmp[0] = 0;
    tmp[1] = 0;

    edges.push_back(tmp);
    for(long long i = 0; m > i; i++){
        cin >> l >> r;
        tmp[0] = l;
        tmp[1] = r;
        edges.push_back(tmp);
    }
    vector <array <long long , 4> > queries;
    array <long long , 4> tm;

    for(long long i = 0; q > i; i++){
        cin >> l >> r;
        tm[0] = l;
        tm[1] = r;
        tm[2] = i;
        tm[3] = 0;
        queries.push_back(tm);
    }
    sort(queries.begin(), queries.end());
    for(long long i = 0; q > i; i++){
        queries[i][3] = i;
        if(smL[i / sH] == 0){
            smL[i / sH] = 1e9;
        }
        smL[i / sH] = min(smL[i / sH] , queries[i][0]);
    }
    sort(queries.begin(), queries.end() , comp);
    l = 1;
    r = m;
    long long po = 0;
    bool isBi = true;
    for(long long i = 0; q > i; i++){
        if(i == 0 || (queries[i - 1][3] / sH) != (queries[i][3] / sH)){
            rollback(po);
            r = m;
            while(l < smL[queries[i][3] / sH]){
                isBi = (isBi & uni(edges[l][0] , edges[l][1]));
                l++;
            }
            po = st.size();
        }
        while(r > 1 && r > queries[i][1]){
            isBi = (isBi & uni(edges[r][0] , edges[r][1]));
            r--;
        }
        long long tmr = st.size();
        l = smL[queries[i][3] / sH];
        while(m > l && l < queries[i][0]){
            isBi = (isBi & uni(edges[l][0] , edges[l][1]));
            l++;
        }

        if(cnt == 0){
            isBi = true;
        }
        ans[queries[i][2]] = !(isBi);
        rollback(tmr);
        l = smL[queries[i][3] / sH];
    }
    for(long long i = 0; q > i; i++){
        if(ans[i]){
            cout << "YES\n";
        }
        else{
            cout << "NO\n";
        }
    }




}
#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...