Guest User

B. Мафия в КБТУ!

a guest
Nov 1st, 2011
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. const int maxn = 202020;
  7.  
  8. typedef pair<int,int> pii;
  9.  
  10. const pii inf = make_pair(1<<30,0);
  11.  
  12. char q;
  13. pii a[1<<20];
  14. bool killed[maxn];
  15. vector<int> e[maxn];
  16. int pos[maxn<<1], parent[maxn], n, m, t, i, N, v, u;
  17.  
  18. void dfs(int v, int lvl, int pr)
  19. {
  20.     a[++m] = make_pair(lvl,v);
  21.     pos[v] = m;
  22.     parent[v] = pr;
  23.     for (int i = 0; i < e[v].size(); i++)
  24.     {
  25.         int u = e[v][i];
  26.         dfs(u, lvl + 1, v);
  27.         a[++m] = make_pair(lvl,v);
  28.     }
  29. }
  30.  
  31. int lca(int u, int v)
  32. {
  33.     int l = pos[u];
  34.     int r = pos[v];
  35.     if (l > r) swap(l, r);
  36.     pii ans = inf;
  37.     while (l <= r)
  38.     {
  39.         ans = min(ans, a[l]);
  40.         ans = min(ans, a[r]);
  41.         l = (l + 1) >> 1;
  42.         r = (r - 1) >> 1;
  43.     }
  44.     return ans.second;
  45. }
  46.  
  47. int get_pr(int v)
  48. {
  49.     if (!killed[v])
  50.         return v;
  51.     return parent[v] = get_pr(parent[v]);
  52. }
  53.  
  54. int main()
  55. {
  56.     freopen("mafia.in", "r", stdin);
  57.     scanf("%d\n", &m);
  58.     n = 1;
  59.     while (m--)
  60.     {
  61.         q = getchar();
  62.         if (q == '+')
  63.         {
  64.             scanf("%d\n", &v);
  65.             e[v].push_back(++n);
  66.         }
  67.         else
  68.         if (q == '-')
  69.             scanf("%d\n", &v);
  70.         else
  71.             scanf("%d%d\n", &u, &v);
  72.     }
  73.  
  74.     N = n+n-1;
  75.     t = 1;
  76.     while (t < N)
  77.         t <<= 1;
  78.    
  79.     m = t-1;
  80.  
  81.     dfs(1,1,0);
  82.  
  83.     for (i = t+N; i < t+t; i++)
  84.         a[i] = inf;
  85.     for (i = t-1; i > 0; i--)
  86.         a[i] = min(a[i<<1],a[(i<<1)+1]);
  87.  
  88.     freopen("mafia.in", "r", stdin);
  89.     freopen("mafia.out", "w", stdout);
  90.     scanf("%d\n", &m);
  91.     while (m--)
  92.     {
  93.         q = getchar();
  94.         if (q == '+')
  95.             scanf("%d\n", &v);
  96.         else
  97.         if (q == '-')
  98.         {
  99.             scanf("%d\n", &v);
  100.             killed[v] = 1;
  101.         } else
  102.         {
  103.             scanf("%d%d\n", &u, &v);
  104.             printf("%d\n", get_pr(lca(u, v)));
  105.         }
  106.     }
  107.     //exit(0);
  108.     return 0;
  109. }
  110.  
  111.  
Advertisement
Add Comment
Please, Sign In to add comment