Advertisement
Guest User

Untitled

a guest
Jul 30th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. const int MAXN = 123234;
  6. const int INF = (int)2e9 + 7;
  7. vector<int>g[MAXN];
  8. int a[MAXN];
  9. int tin[MAXN], tout[MAXN];
  10. int tin2[MAXN];
  11. int vert[MAXN];
  12. bool addTime[MAXN];
  13. bool used[MAXN];
  14. int timer = 1;
  15. int timer2 = 1;
  16. void dfs(int v)
  17. {
  18. tin[v] = timer;
  19. tin2[v] = timer2;
  20. vert[timer2] = v;
  21. addTime[timer2] = true;
  22. timer2++;
  23. used[v] = true;
  24. timer++;
  25. for (int i = 0; i < (int)g[v].size(); i++)
  26. {
  27. int to = g[v][i];
  28. if (!used[to])
  29. {
  30. dfs(to);
  31. vert[timer2] = v;
  32. addTime[timer2] = true;
  33. timer2++;
  34. }
  35. }
  36. tout[v] = timer;
  37. vert[timer] = v;
  38. addTime[timer] = false;
  39. timer++;
  40. }
  41.  
  42. bool isAncestor(int u, int v)
  43. {
  44. return tin[u] <= tin[v] && tout[u] >= tout[v];
  45. }
  46. struct data
  47. {
  48. bool haveAlive;
  49. int minVal;
  50. int maxVal;
  51. int res;
  52. data()
  53. {
  54. haveAlive = false;
  55. minVal = 0;
  56. maxVal = 0;
  57. res = (int)2e9 + 7;
  58. }
  59. };
  60. void merge(data& res, const data& l, const data& r)
  61. {
  62. res.haveAlive = l.haveAlive | r.haveAlive;
  63. res.res = INF;
  64. if (l.haveAlive)
  65. {
  66. res.minVal = l.minVal;
  67. res.res = min(res.res, l.res);
  68. }
  69. else
  70. {
  71. res.minVal = r.minVal;
  72. }
  73. if (r.haveAlive)
  74. {
  75. res.maxVal = r.maxVal;
  76. res.res = min(res.res, r.res);
  77. }
  78. else
  79. {
  80. res.maxVal = l.maxVal;
  81. }
  82. if (l.haveAlive && r.haveAlive)
  83. {
  84. res.res = min(res.res, r.minVal - l.maxVal);
  85. }
  86. }
  87. pair<int, int>nodes[MAXN];
  88. int nodePos[MAXN];
  89. struct segmentTree
  90. {
  91. vector<data> tree;
  92. segmentTree(){}
  93. segmentTree(int n)
  94. {
  95. tree.resize(4 * n + 17);
  96. }
  97. void build(int v, int tl, int tr)
  98. {
  99. if (tl == tr)
  100. {
  101. tree[v].minVal = nodes[tl].first;
  102. tree[v].maxVal = nodes[tl].first;
  103. }
  104. else
  105. {
  106. int tm = (tl + tr) >> 1;
  107. build(v + v, tl, tm);
  108. build(v + v + 1, tm + 1, tr);
  109. merge(tree[v], tree[v + v], tree[v + v + 1]);
  110. }
  111. }
  112. void make(int v, int tl, int tr, int pos, bool active)
  113. {
  114. if (tl == tr)
  115. {
  116. tree[v].haveAlive = active;
  117. }
  118. else
  119. {
  120. int tm = (tl + tr) >> 1;
  121. if (pos <= tm)
  122. {
  123. make(v + v, tl, tm, pos, active);
  124. }
  125. else
  126. {
  127. make(v + v + 1, tm + 1, tr, pos, active);
  128. }
  129. merge(tree[v], tree[v + v], tree[v + v + 1]);
  130. }
  131. }
  132. int solve1()
  133. {
  134. return tree[1].res;
  135. }
  136. int solve2()
  137. {
  138. return tree[1].maxVal - tree[1].minVal;
  139. }
  140. };
  141. segmentTree st;
  142. int BUBEN;
  143.  
  144. int curCnt[MAXN];
  145. bool onPath[MAXN];
  146. int n;
  147. void process(int v, int newv, int other)
  148. {
  149. if (onPath[newv])
  150. {
  151. st.make(1, 1, n, nodePos[v], false);
  152. onPath[v] = false;
  153. }
  154. else
  155. {
  156. st.make(1, 1, n, nodePos[newv], true);
  157. onPath[newv] = true;
  158. }
  159. }
  160.  
  161. struct query
  162. {
  163. int l, r;
  164. bool C;
  165. int id;
  166. };
  167.  
  168. bool operator<(query a, query b)
  169. {
  170. if (a.l / BUBEN != b.l / BUBEN) return a.l < b.l;
  171. int block = a.l / BUBEN;
  172. return (block % 2) ^ (a.r < b.r);
  173. }
  174.  
  175. query q[MAXN];
  176. int res[MAXN];
  177.  
  178. int main()
  179. {
  180. //freopen("input.txt", "r", stdin);
  181. scanf("%d", &n);
  182. st = segmentTree(n + 1);
  183. for (int i = 1; i <= n; i++)
  184. {
  185. scanf("%d", &a[i]);
  186. nodes[i].first = a[i];
  187. nodes[i].second = i;
  188. }
  189. sort(nodes + 1, nodes + 1 + n);
  190. st.build(1, 1, n);
  191. for (int i = 1; i <= n; i++)
  192. {
  193. nodePos[nodes[i].second] = i;
  194. }
  195. for (int i = 1; i < n; i++)
  196. {
  197. int u, v;
  198. scanf("%d %d", &u, &v);
  199. g[u].push_back(v);
  200. g[v].push_back(u);
  201. }
  202. dfs(1);
  203. BUBEN = sqrt(timer2);
  204. int qq;
  205. scanf("%d\n", &qq);
  206. for (int i = 1; i <= qq; i++)
  207. {
  208. char type;
  209. int u, v;
  210. scanf("%c %d %d\n", &type, &u, &v);
  211. int l = tin2[u], r = tin2[v];
  212. if (l > r) swap(l, r);
  213. q[i].l = l;
  214. q[i].r = r;
  215. q[i].C = (type == 'C');
  216. q[i].id = i;
  217. }
  218. sort(q + 1, q + 1 + qq);
  219. int l = 1, r = 1;
  220. onPath[1] = true;
  221. st.make(1, 1, n, nodePos[1], true);
  222. for (int i = 1; i <= qq; i++)
  223. {
  224. while (r < q[i].r)
  225. {
  226. r++;
  227. process(vert[r - 1], vert[r], vert[l]);
  228. }
  229. while (l > q[i].l)
  230. {
  231. l--;
  232. process(vert[l + 1], vert[l], vert[r]);
  233. }
  234. while (r > q[i].r)
  235. {
  236. process(vert[r], vert[r - 1], vert[l]);
  237. r--;
  238. }
  239. while (l < q[i].l)
  240. {
  241. process(vert[l], vert[l + 1], vert[r]);
  242. l++;
  243. }
  244. // magic.print();
  245. if (q[i].C)
  246. {
  247. res[q[i].id] = st.solve1();
  248. }
  249. else
  250. {
  251. res[q[i].id] = st.solve2();
  252. }
  253. }
  254. for (int i = 1; i <= qq; i++)
  255. {
  256. printf("%d\n", res[i]);
  257. }
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement