제출 #1148286

#제출 시각아이디문제언어결과실행 시간메모리
1148286byunjaewooJoker (BOI20_joker)C++20
0 / 100
2096 ms39360 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=1; 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); for(int i=1; i<=m; i++) F(i, i, 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...