Submission #871044

#TimeUsernameProblemLanguageResultExecution timeMemory
871044NaimSSJoker (BOI20_joker)C++14
100 / 100
316 ms42044 KiB
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define pb push_back
#define ld long double
#define ff first
#define ss second
#define endl '\n'
#define sz(v) ((int)v.size())
#define all(v) begin(v),end(v)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;

void dbg_out() { cerr << endl ;}
template<typename Head, typename... Tail> void dbg_out(Head H,Tail... T){
	cerr<<' '<<H ;
	dbg_out(T...);
}
#ifdef LOCAL
#define dbg(...) cerr<<"("<< #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__), cerr << endl;
#else 
#define dbg(...) 42
#endif

struct event{
	int a,b,psb,pa,corA,is_good;
	event(int a,int b,int psb,int pa,int corA,int is_good):
	a(a),b(b),psb(psb),pa(pa),corA(corA), is_good(is_good){}
};

struct DSU{
	vector<event> st;
	int is_good;
	int n;
	vi p,ps,ar;
	DSU(){}
	DSU(int n):n(n){
		p = ps = vi(n+1,1);
		ar = vi(n+1,0);
		rep(i,0,n+1)p[i] = i, ps[i] = 1, ar[i] = 0;
		is_good = 1;
	}
	int f(int x){
		while(x!=p[x])x = p[x];
		return x;
	}
	int cor(int x){
		int c=0;
		while(x!=p[x])c^=ar[x],x=p[x];
		return c;
	}
	pii F(int x){
		int c=0;
		while(x!=p[x])c^=ar[x],x=p[x];
		return pii(x,c);
	}
	bool join(int A,int B){
		auto [a,ca] = F(A);
		auto [b,cb] = F(B);
		if(ps[a] > ps[b])swap(a,b),swap(ca,cb);
		st.pb(event(a,b,ps[b],p[a],ar[a],is_good));
		if(a == b){
			if(ca == cb)is_good = 0;
			return 0;	
		}
		ps[b] += ps[a], p[a] = b;
		ar[a] = (ca^cb^1);
		// dbg(a,b,ps[a], ps[b], p[a], p[b]);
		return 1;
	}
	int can_add(int A,int B){
		auto [a,ca] = F(A);
		auto [b,cb] = F(B);
		if(a == b && ca == cb)return 0;
		return 1;
	}
	void undo(int qtd=1){
		while(qtd--){
			auto x = st.back();
			p[x.a] = x.pa,ps[x.b] = x.psb,is_good = x.is_good;
			ar[x.a] = x.corA;
			st.pop_back();
		}
	}
	void clear(){
		undo(sz(st));
	}
	int ok(){return is_good;}
	void push(pii x){
		join(x.ff,x.ss);
	}
	void pop(){ undo();}
};

const int N = 2 * (200100);
const int SQ = 400;
int a[N], b[N];
struct query{
	int l,r,id;
	query(int l,int r,int id):l(l),r(r),id(id){}
};
vector<query> Q[N];
int res[N];
#define F first
#define S second
DSU DS(N);
template<class U>
class ds_queue{
public:
	void push(U upd ){
		Q.push_back({upd, 1});
		DS.push(upd);
	}
	void pop(){
		if(!sz(Q))
			return;
		if(Q.back().S){
			vector< pair< U , bool> > block[2];
			do{
				block[Q.back().S].push_back(Q.back());
				Q.pop_back() , DS.pop();
			} while(sz(block[0]) != sz(block[1]) && sz(Q));
			if(!sz(block[0])){
				for(auto & w : block[1])
					w.S = 0 , DS.push(w.F);
				swap(Q,block[1]);
			}
			else{
				for(int j = 1; j >= 0 ; j --){
					while(sz(block[j])){
						auto w = block[j].back();
						block[j].pop_back();
						Q.push_back(w) , DS.push(w.F);
					}
				}
			}
		}
		DS.pop() , Q.pop_back();
	}
private:
	vector < pair< U , bool> > Q;
};
int first[N];

int32_t main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	int n,m,qr;
	cin >> n >> m >> qr;
	for(int i=0;i<m;i++){
		cin >> a[i] >> b[i];
	}
	ds_queue<pii> q;
	vi first(2*m);
	int ptr=0;
	for(int i=0;i<2*m;i++){
		int A = a[i%m],B = b[i%m];
		while(!DS.can_add(A,B)){
			q.pop();
			ptr++;
		}
		q.push(pii(A,B));
		first[i] = ptr;
	}
	rep(i,0,qr){
		int l,r;
		cin >> l >> r;
		--l,--r;
		if(first[l  + m - 1] <= r + 1)cout << "NO\n";
		else cout<< "YES\n";
	}
	
}

Compilation message (stderr)

Joker.cpp: In member function 'bool DSU::join(int, int)':
Joker.cpp:61:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   61 |   auto [a,ca] = F(A);
      |        ^
Joker.cpp:62:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   62 |   auto [b,cb] = F(B);
      |        ^
Joker.cpp: In member function 'int DSU::can_add(int, int)':
Joker.cpp:75:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   75 |   auto [a,ca] = F(A);
      |        ^
Joker.cpp:76:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   76 |   auto [b,cb] = F(B);
      |        ^
#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...