Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int,int> ii;
  5.  
  6. struct edge{
  7.     int l,r;
  8.     int u,v;
  9.    
  10.     edge(int _l = 0,int _r = 0,int _u = 0,int _v = 0){
  11.         l = _l;
  12.         r = _r;
  13.         u = _u;
  14.         v = _v;
  15.     }
  16.    
  17.     bool contido(int a,int b)const{
  18.         return a >= l && b <= r;
  19.     }
  20.    
  21. };
  22.  
  23. const int MAXN = 2*1e5 + 10;
  24.  
  25. char entrada[50];
  26. vector<edge> A;
  27. int pai[MAXN],tamanho[MAXN],oldx[MAXN],oldy[MAXN],oldtamx[MAXN],oldtamy[MAXN],ehatualizacao[MAXN],dsuPtr,N,M;
  28. int e1[MAXN],e2[MAXN],e3[MAXN];
  29. map<ii,int> arestas;
  30.  
  31. int find(int x){
  32.     if(x == pai[x]) return x;
  33.     return find(pai[x]);
  34. }
  35.  
  36. void join(int x,int y){
  37.     x = find(x);
  38.     y = find(y);
  39.     dsuPtr++;
  40.     if(x == y){
  41.         ehatualizacao[dsuPtr] = 0;
  42.         return;
  43.     }
  44.     ehatualizacao[dsuPtr] = 1;
  45.    
  46.     if(tamanho[x] < tamanho[y]) swap(x,y);
  47.     oldx[dsuPtr] = x;
  48.     oldy[dsuPtr] = y;
  49.     oldtamx[dsuPtr] = tamanho[x];
  50.     oldtamy[dsuPtr] = tamanho[y];
  51.     pai[y] = x;
  52.     tamanho[x] += tamanho[y];
  53. }
  54.  
  55. void undo(){
  56.     if(!ehatualizacao[dsuPtr]){
  57.         dsuPtr--;
  58.         return;
  59.     }
  60.     int x = oldx[dsuPtr];
  61.     int y = oldy[dsuPtr];
  62.     int tx = oldtamx[dsuPtr];
  63.     int ty = oldtamy[dsuPtr];
  64.     dsuPtr--;
  65.     pai[x] = x;
  66.     pai[y] = y;
  67.     tamanho[x] = tx;
  68.     tamanho[y] = ty;
  69. }
  70.  
  71. void adiciona_aresta(int u,int v,int l,int r){
  72.     edge nova(l,r,u,v);
  73.     A.push_back(nova);
  74. }
  75.  
  76. void solve(int left,int right,vector<edge> E){
  77.    
  78.     vector<edge> L,R;
  79.     int adicionadas = 0;
  80.     int mid = left + (right - left)/2;
  81.    
  82.     for(edge davez : E){
  83.         if(davez.contido(left,right)){
  84.             adicionadas++;
  85.             join(davez.u,davez.v);
  86.         }
  87.         else{
  88.             if(davez.r <= mid){
  89.                 L.push_back(davez);
  90.             }
  91.             else if(davez.l >= mid + 1){
  92.                 R.push_back(davez);
  93.             }
  94.             else{
  95.                 edge p1(davez.l,mid,davez.u,davez.v);
  96.                 L.push_back(p1);
  97.                 edge p2(mid+1,davez.r,davez.u,davez.v);
  98.                 R.push_back(p2);
  99.             }
  100.         }
  101.     }
  102.    
  103.     if(left == right){
  104.         if(e3[left] == -1) e3[left] = -1;
  105.         else e3[left] = (find(e1[left]) == find(e2[left]));
  106.     }
  107.     else{
  108.         solve(left,mid,L);
  109.         solve(mid+1,right,R);
  110.     }
  111.    
  112.     for(int i = 1;i<=adicionadas;i++){
  113.         undo();
  114.     }
  115.    
  116. }
  117.  
  118. int main(){
  119.    
  120.     scanf("%d %d",&N,&M);
  121.    
  122.     for(int i = 1;i<=N;i++){
  123.         pai[i] = i;
  124.         tamanho[i] = 1;
  125.     }
  126.    
  127.     for(int i = 1;i<=M;i++){
  128.         scanf("%s %d %d",entrada,&e1[i],&e2[i]);
  129.        
  130.         if(entrada[0] == 'a'){
  131.             e3[i] = -1;
  132.             if(e1[i] > e2[i]) swap(e1[i],e2[i]);
  133.             ii novo = ii(e1[i],e2[i]);
  134.             arestas[novo] = i;
  135.         }
  136.         else if(entrada[0] == 'r'){
  137.             e3[i] = -1;
  138.             if(e1[i] > e2[i]) swap(e1[i],e2[i]);
  139.             ii novo = ii(e1[i],e2[i]);
  140.             int ini = arestas[novo];
  141.             int fim = i;
  142.             adiciona_aresta(novo.first,novo.second,ini,fim);
  143.             arestas.erase(novo);
  144.         }
  145.         else{
  146.             continue;
  147.         }
  148.        
  149.     }
  150.     for(map<ii,int>::iterator it = arestas.begin();it != arestas.end();it++){
  151.         ii davez = (*it).first;
  152.         int ini = (*it).second;
  153.         adiciona_aresta(davez.first,davez.second,ini,M + 1);
  154.     }
  155.     arestas.clear();
  156.  
  157.     solve(1,M,A);
  158.     for(int i = 1;i<=M;i++){
  159.         if(e3[i] == -1) continue;
  160.         if(e3[i] == 1) printf("YES\n");
  161.         else printf("NO\n");
  162.     }
  163.    
  164.     return 0;
  165.    
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement