Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2020
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define endl '\n'
  3. using namespace std;
  4. typedef pair<int,int> pii;
  5. const int maxn=1e6+10;
  6. int n,m,k,q;
  7. vector<int> e[maxn];
  8. int depth[maxn],top[maxn],link[maxn],able[maxn],ind[maxn],parent[maxn];
  9. int dfs(int now=1,int p=1,int d=0){
  10.     depth[now]=d; parent[now]=p;
  11.     pii maxx={0,0};
  12.     int t,siz=1;
  13.     for(auto &to:e[now])
  14.         if(to!=p)
  15.             t=dfs(to,now,d+1),siz+=t,maxx=max(maxx,pii{t,to});
  16.     if(siz==1) link[now]=0;
  17.     else link[now]=maxx.second;
  18.     return siz;
  19. }
  20. void decomp(int &cnt,int now=1,int p=1,int t=1){
  21.     ind[now]=cnt++; top[now]=t;
  22.     if(link[now]) decomp(cnt,link[now],now,t);
  23.     for(auto &to:e[now])
  24.         if(to!=p&&to!=link[now])
  25.             decomp(cnt,to,now,to);
  26. }
  27. void fill(int a,int b){
  28.     if(a>b) swap(a,b);
  29.     able[a]++; able[b+1]--;
  30. }
  31. void sets(int a,int b){
  32.     while(top[a]!=top[b]){
  33.         if(depth[top[a]]>depth[top[b]])
  34.             fill(ind[top[a]],ind[a]),ind[parent[top[a]]],a=parent[top[a]];
  35.         else
  36.             fill(ind[top[b]],ind[b]),ind[parent[top[b]]],b=parent[top[b]];
  37.     }
  38.     if(a>b) swap(a,b);
  39.     fill(ind[a]+1,ind[b]);
  40. }
  41. void prefix(){
  42.     for(int i=1;i<=n;i++) able[i]+=able[i-1];
  43.     for(int i=1;i<=n;i++) able[i]=bool(able[i]);
  44.     for(int i=1;i<=n;i++) able[i]+=able[i-1];
  45. }
  46. bool check(int a,int b){
  47.     // cout<<a<<'-'<<b<<' ';
  48.     a=ind[a]; b=ind[b];
  49.     if(a>b) swap(a,b);
  50.     // cout<<(able[b]-able[a]==b-a)<<endl;
  51.     return able[b]-able[a]==b-a;
  52. }
  53. int query(int a,int b){
  54.     while(a!=b){
  55.         // cout<<a<<' '<<b<<endl;
  56.         if(top[a]==top[b]) return check(a,b);
  57.         if(depth[top[a]]>depth[top[b]]){
  58.             if(!check(a,top[a])) return 0;
  59.             if(able[ind[top[a]]]-able[ind[top[a]]-1]==0) return 0;
  60.             // if(!check(parent[top[a]],parent[top[a]])) return false;
  61.             a=parent[top[a]];
  62.         }else{
  63.             if(!check(b,top[b])) return 0;
  64.             if(able[ind[top[b]]]-able[ind[top[b]]-1]==0) return 0;
  65.             // if(!check(parent[top[b]],parent[top[b]])) return false;
  66.             b=parent[top[b]];
  67.         }
  68.     }
  69.     return 1;
  70. }
  71. int main(){
  72.     // ios_base::sync_with_stdio(false); cin.tie(0);
  73.     int a,b;
  74.     cin>>n>>m>>k>>q;
  75.     for(int i=0;i<m;i++) cin>>a>>b,e[a].push_back(b),e[b].push_back(a);
  76.     dfs();
  77.     a=1; decomp(a);
  78.     for(int i=0;i<k;i++) cin>>a>>b,sets(a,b);
  79.     prefix();
  80.     // for(int i=1;i<=n;i++) cout<<i<<' '<<able[ind[i]]-able[ind[i]-1]<<' '<<ind[i]<<' '<<link[i]<<' '<<depth[i]<<' '<<top[i]<<endl;
  81.     for(int i=0;i<q;i++) cin>>a>>b,cout<<query(a,b)<<endl;
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement