Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include<set>
  2. #include <unordered_set>
  3. #include <unordered_map>
  4. #include<map>
  5. #include<list>
  6. #include<iomanip>
  7. #include<cmath>
  8. #include<string>
  9. #include<vector>
  10. #include<queue>
  11. #include<stack>
  12. #include<complex>
  13. #include<sstream>
  14. #include<iostream>
  15. #include<fstream>
  16. #include<algorithm>
  17. #include<numeric>
  18. #include<utility>
  19. #include<functional>
  20. #include<stdio.h>
  21. #include<assert.h>
  22. #include<memory.h>
  23. #include<bitset>
  24. #include<math.h>
  25. #include <string.h>
  26. #include <strings.h>
  27.  
  28.  
  29. #define f first
  30. #define s second
  31. #define mp make_pair
  32. #define pb push_back
  33. #define lp(i,a,n) for(int i=(a);i<=(int)(n);++i)
  34. #define lpd(i,a,n) for(int i=(a);i>=(int)(n);--i)
  35. #define clr(a,b) memset(a,b,sizeof a)
  36. #define all(v) v.begin(),v.end()
  37. #define println(a) cout <<(a) <<endl
  38. #define sz(x) ((int)(x).size())
  39. #define readi(x) scanf("%d",&x)
  40. #define read2i(x,y) scanf("%d%d",&x,&y)
  41. #define read3i(x,y,z) scanf("%d%d%d",&x,&y,&z)
  42. #define readll(x) scanf("%I64d",&x)
  43. #define mod 1000000007
  44. #define eps 1e-6
  45. #define infi 1000000000
  46. #define infll 1000000000000000000ll
  47.  
  48.  
  49.  
  50. using namespace std;
  51. typedef long long ll;
  52. typedef pair<int, int> pii;
  53. typedef pair<ll, ll> pll;
  54. typedef vector<int> vi;
  55. typedef vector<vi> vvi;
  56. typedef vector<ll> vll;
  57. typedef set<int> si;
  58. typedef unordered_set<int> usi;
  59. typedef map<int,int> mii;
  60. typedef map<ll,ll> mll;
  61. typedef unordered_map<ll,ll> umll;
  62.  
  63.  
  64. const int N = 100005 , BLOCK_SIZE = 320;
  65. int n,q,t,level[N],startTime[N],endTime[N],perant[N],last[N];
  66. vi adjL[N];
  67.  
  68. void DFS(int node,int depth, int l) {
  69.  
  70. startTime[node] = ++t;
  71. level[node] = depth;
  72. last[node] = l;
  73.  
  74. for(int ch:adjL[node]) DFS(ch, depth+1,!node?ch:l);
  75.  
  76. endTime[node] = t;
  77.  
  78.  
  79. }
  80. vi updated;
  81.  
  82. pii solve(int a) {
  83. pii ret(0,last[a]);
  84.  
  85. for(int p:updated) if(startTime[p] <= startTime[a] && endTime[p] >= endTime[a]){
  86. ret.f += level[a]-level[p]+1;
  87. a = perant[p];
  88. if(a) ret.s = last[a];
  89. else ret.s = last[p];
  90. }
  91.  
  92. return {ret.f + level[a],ret.s};
  93. }
  94.  
  95.  
  96.  
  97. int main(){
  98.  
  99. scanf("%d%d",&n,&q);
  100.  
  101. lp(i, 1, n) {
  102. int a;
  103. scanf("%d",&a);
  104. a += i;
  105. if(a > n) a = 0 ;
  106. adjL[a].pb(i);
  107. perant[i] = a;
  108. }
  109.  
  110. DFS(0, 0 ,0);
  111. vi temp;
  112. lp(i, 1, q) {
  113.  
  114. if(q%BLOCK_SIZE == 0) {
  115. updated.clear();
  116. lp(i, 1, n) adjL[perant[i]].pb(i);
  117. t = 0 ,DFS(0, 0 ,0);
  118. }
  119.  
  120.  
  121. int t,a,b;
  122. scanf("%d%d",&t,&a);
  123.  
  124. if(!t) {
  125. scanf("%d",&b);
  126. b += a;
  127. if(b > n) b = 0;
  128. if(b == perant[a]) continue;
  129. perant[a] = b ;
  130. if(!b) last[a] = a;
  131. while(!updated.empty() && level[updated.back()] < level[a])
  132. temp.pb(updated.back()) , updated.pop_back();
  133. updated.pb(a);
  134. while (!temp.empty()) updated.pb(temp.back());
  135.  
  136. } else {
  137. pii ans = solve(a);
  138. printf("%d %d\n",ans.s,ans.f);
  139. }
  140.  
  141.  
  142.  
  143.  
  144. }
  145.  
  146. }
  147.  
  148. //freopen("input.txt","r",stdin);
  149. //freopen("output.txt","w",stdout);
  150. //ios::sync_with_stdio(0);cin.tie(0);
  151. /*
  152. 10 10
  153. 5 1 2 4 1 7 3 8 10 8
  154. 0 5 6
  155. 1 8
  156. 1 1
  157. 0 10 3
  158. 1 5
  159. 1 3
  160. 1 2
  161. 0 6 1
  162. 1 9
  163. 1 1
  164.  
  165. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement