Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1. #pragma comment(linker,"/STACK:256000000")
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <cstdio>
  5. #include <map>
  6. #include <set>
  7. #include <sstream>
  8. #include <string>
  9. #include <iostream>
  10. #include <utility>
  11. #include <queue>
  12. #include <cmath>
  13. #include <stack>
  14. #include <memory.h>
  15. #include <algorithm>
  16. using namespace std;
  17. #define forn(i,n) for(int i=0;i<(n);++i)
  18. #define fornr(i,n) for(int i=(n)-1;i>=0;--i)
  19. #define forv(i,v) forn(i,(int)v.size())
  20. #define fors(i,v) forn(i,(int)v.length())
  21. #define forvr(i,v) fornr(i,(int)v.size())
  22. #define mp make_pair
  23. #define pb push_back
  24. #define lng long long
  25. #define SQ(a) ((a)*(a))
  26. #define eps 1e-9
  27. #define VI vector<int>
  28. #define PII pair<int, int>
  29. #define all(v) (v).begin(),(v).end()
  30. #define iinf 1000000000
  31. #define linf 1000000000000000000LL
  32. #define pi 3.1415926535897932384626433832795
  33. #define inp asdinp
  34. #define prev asdprev
  35.  
  36.  
  37. struct tree
  38. {
  39.     vector<int> t;
  40.     int n;
  41.  
  42.     tree(int n)
  43.     {
  44.         this->n = n;
  45.         t = vector<int> (n*6);
  46.     }
  47.  
  48.  
  49.     int get(int l, int r, int i, int tl, int tr)
  50.     {
  51.         if (l==tl && r==tr)
  52.             return t[i];
  53.         int m = (tl+tr)/2;
  54.  
  55.         if (r<=m)
  56.             return get(l, r, i*2+1, tl, m);
  57.         if (l>m)
  58.             return get(l, r, i*2+2, m+1, tr);
  59.         return get(l, m, i*2+1, tl, m) + get(m+1, r, i*2+2, m+1, tr);
  60.     }
  61.     tree(){}
  62.     void update(int pos, int val, int i, int l, int r)
  63.     {
  64.         if (l==r)t[i] = val;
  65.         else
  66.         {
  67.             int m = (l+r)/2;
  68.             if (pos<=m)
  69.                 update(pos, val, i*2+1, l, m);
  70.             else
  71.                 update(pos, val, i*2+2, m+1, r);
  72.             t[i]=t[2*i+1]+t[2*i+2];
  73.         }
  74.     }
  75. };
  76.  
  77.  
  78. tree trees[100000+10];
  79.  
  80.  
  81. int type[100000+10];
  82. int query_a[100000+10];
  83. int query_b[100000+10];
  84. char s[10];
  85.  
  86.  
  87. vector<int> graph[100000+10];
  88. int maxlev[100000+10];
  89.  
  90. vector<int> level[100000+10];
  91. int go[100000+10][20];
  92.  
  93. int vlevel[100000+10];
  94. int vidx[100000+10];
  95. int levels_cnt=0;
  96. int dfs(int v, int parent, int lev)
  97. {
  98.     levels_cnt=max(levels_cnt, lev);
  99.     level[lev].pb(v);
  100.     vidx[v]=level[lev].size()-1;
  101.     vlevel[v]=lev;
  102.     int maxlevel=0;
  103.     int first=-1;
  104.     forv(i, graph[v])
  105.     {
  106.         if (graph[v][i]!=parent)
  107.         {
  108.             if (first==-1)first=graph[v][i];
  109.             maxlevel = max(dfs(graph[v][i], v, lev+1), maxlevel);
  110.         }
  111.     }
  112.     go[v][0]=first;
  113.  
  114.     maxlev[v]=maxlevel;
  115.     return maxlev[v]+1;
  116. }
  117.  
  118. int solve(int v, int d)
  119. {
  120.     if (vlevel[v]+d>maxlev[v]+1)
  121.     {
  122.         return 0;
  123.     }
  124.  
  125.     int left = v;
  126.     forn(i, 30)
  127.     {
  128.         if (d&(1<<i))
  129.         {
  130.             left = go[left][i];
  131.         }
  132.     }
  133.  
  134.     left = vidx[left];
  135.  
  136.     int right=-1;
  137.     if (vidx[v]==level[vlevel[v]].size()-1)
  138.     {
  139.         right=level[vlevel[v]+d].size()-1;
  140.     }
  141.     else
  142.     {
  143.         right = level[vlevel[v]][vidx[v]+1];
  144.         forn(i, 30)
  145.         {
  146.             if (d&(1<<i))
  147.             {
  148.                 if (right!=-1)right = go[right][i];
  149.             }
  150.         }
  151.         if (right!=-1)
  152.             right = vidx[right];
  153.     }
  154.     if (right==-1)
  155.         right = level[vlevel[v]+d].size()-1;
  156.     return trees[vlevel[v]+d].get(left, right, 0, 0, level[vlevel[v]].size()-1);
  157.  
  158. }
  159.  
  160.  
  161. int main(int argc,    char *argv[])
  162. {
  163. #ifdef __ASD__
  164.     freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
  165. #else
  166.     freopen(filename".in", "r", stdin);freopen(filename".out", "w", stdout);
  167. #endif
  168.  
  169.     int n;
  170.     cin >> n;
  171.     gets(s);
  172.     forn(i,n)
  173.     {
  174.         char c;
  175.         int u, v;
  176.         scanf("%c %d %d\n", &c, &u, &v);
  177.         if (c=='Z')
  178.         {
  179.             type[i]=1;
  180.             --u;
  181.             --v;
  182.             graph[u].pb(v);
  183.             graph[v].pb(u);
  184.             query_a[i]=u;
  185.             query_b[i]=v;
  186.         }
  187.         else
  188.         {
  189.             type[i]=2;
  190.             --u;
  191.             query_a[i]=u;
  192.             query_b[i]=v+1;
  193.         }
  194.     }
  195.  
  196.     memset(go, 255, sizeof(go));
  197.     dfs(0, -1, 0);
  198.     forn(i, levels_cnt+1)
  199.     {
  200.             trees[i]=tree(level[i].size());
  201.     }
  202.     for(int j=1;j<20;++j)
  203.     {
  204.         forn(i,n)
  205.         {
  206.             go[i][j]=go[go[i][j-1]][j-1];
  207.         }
  208.     }
  209.  
  210.  
  211.     forn(i,n)
  212.     {
  213.         if (type[i]==1)
  214.         {
  215.             trees[vlevel[query_a[i]]].update(vidx[query_a[i]], 1, 0, 0, level[vlevel[query_a[i]]].size()-1);
  216.         }
  217.         else
  218.         {
  219.             printf("%d\n", solve( query_a[i], query_b[i]));
  220.         }
  221.     }
  222.     cout.flush();
  223.     return 0;
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement