제출 #1344881

#제출 시각아이디문제언어결과실행 시간메모리
1344881azra_gonulJoker (BOI20_joker)C++20
0 / 100
0 ms344 KiB
#include"bits/stdc++.h"
using namespace std;
const int nMax = 2e5 + 7;
//tmp1[2] -> 1 yeni
// -> 0 eski
long long cnt = 0;
bool ans[nMax];
long long smL[nMax];
long long rnk[nMax];
long long eq[nMax];
long long par[nMax];
vector <array <long long , 2> > edges;
array <long long , 4 > tmp1;
stack <array <long long , 4 > > st;
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]);
}


void rb(){
	long long piv = st.top()[0];
    if(piv == -1){
       	cnt = st.top()[1];
        st.pop();
        return;
    }
    eq[piv] = 0;
    rnk[par[piv]] -= rnk[piv];
    par[piv] = piv;
    st.pop();
}

bool uni(long long a , long long b , long long k){
    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";
    tmp1[3] = k;
    if(fr.first == sec.first){
    	tmp1[0] = -1;
    	tmp1[1] = cnt;
    	tmp1[2] = 1;
    	st.push(tmp1);
        if(fr.second == sec.second){
            cnt++;
            return false;
        }
        return true;
    }
    a = fr.first;
    b = sec.first;
    if(rnk[a] > rnk[b]){
        swap(a , b);
    }
    tmp1[0] = a;
    tmp1[1] = -1;
    tmp1[2] = 1;
    st.push(tmp1);
    rnk[b] += rnk[a];
    eq[a] = 0;
    if(fr.second == sec.second){
        eq[a] = 1;
    }
    par[a] = b;

    return true;
}
void fix(){
	int eS = 0;
	int yS = 0;
	vector <array <long long , 4 > > e;
	vector <array <long long , 4 > > y;
	if(st.top()[2] == 1){
		yS++;
		y.push_back(st.top());
		rb();
	}
	else{
		eS++;
		e.push_back(st.top());
		rb();
	}
	while(st.size() && eS != yS){
		if(st.top()[2] == 1){
			yS++;
			y.push_back(st.top());
			rb();
		}
		else{
			eS++;
			e.push_back(st.top());
			rb();
		}
	}
	if(eS == 0 && !st.size()){
		for(long long i = 0; y.size() > i; i++){
			y[i][2] = 0;
			uni(edges[y[i][3]][0] ,edges[y[i][3]][1] , y[i][3]);
			st.top()[2] = 0;
		}
	}
	else{
		for(long long i = y.size() - 1; 0 <= i; i--){
			uni(edges[y[i][3]][0] ,edges[y[i][3]][1] , y[i][3]);
		}
		for(long long i = e.size() - 1; 0 <= i; i--){
			uni(edges[e[i][3]][0] ,edges[e[i][3]][1] , e[i][3]);
			st.top()[2] = 0;
		}

	}
}
void rollback(){
	if(st.top()[2] == 0){
		rb();
		return;
	}
	fix();
    rb();
    
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    long long n , m , q , l , r;
    array <long long , 2> tmp;
    cin >> n >> m >> 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);
        uni(l , r , i + 1);
    }
    r = 0;
    for(long long i = 1; n >= i; i++){
    	while(m >= r && cnt != 0){
    		r++;
    		rollback();
    	}
    	cout << i << " " << r << "\n";
    	smL[i] = r;
    	uni(edges[i][0] , edges[i][1] , i);
     }
     for(long long i = 0; q > i; i++){
    	cin >>l >> r;
    	if(smL[l] > r){
    		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...