Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.45 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7.  
  8. const int MAXN = 30005;
  9.  
  10. int n, k, q;
  11. vector <int> graph[MAXN];
  12. int root, parent[MAXN], dr[MAXN][22][22], uc[MAXN], u;
  13. int a[MAXN], b[MAXN], path[MAXN], k0, k1, k2;
  14.  
  15. void dfs(int v)
  16. {
  17. int sz = graph[v].size();
  18. for(int i = 0; i < sz; i++)
  19. {
  20. int to = graph[v][i];
  21. if(to != parent[v])
  22. {
  23. parent[to] = v;
  24. dfs(to);
  25. }
  26. }
  27. }
  28.  
  29. void read_input()
  30. {
  31. scanf("%d", &n);
  32.  
  33. int v, w;
  34. for(ll i = 0; i < n - 1; i++)
  35. {
  36. scanf("%d %d", &v, &w);
  37. graph[v].push_back(w);
  38. graph[w].push_back(v);
  39. }
  40. root = 1;
  41.  
  42. for(int i = 2; i <= n; i++)
  43. {
  44. if(graph[root].size() < graph[i].size())
  45. {
  46. root = i;
  47. }
  48. }
  49. }
  50.  
  51. void LCA(int v, int w)
  52. {
  53. u++;
  54. int lca, v1 = v, w1 = w;
  55. k0 = 0, k1 = 0, k2 = 0;
  56.  
  57. for(;;)
  58. {
  59. if(v1 != root)
  60. {
  61. a[k0++] = v1;
  62. if(uc[v1] == u)
  63. {
  64. lca = v1;
  65. break;
  66. }
  67. uc[v1] = u;
  68. v1 = parent[v1];
  69. }
  70. if(w1 != root)
  71. {
  72. b[k1++] = w1;
  73. if(uc[w1] == u)
  74. {
  75. lca = w1;
  76. break;
  77. }
  78. uc[w1] = u;
  79. w1 = parent[w1];
  80. }
  81. if(v1 == w1)
  82. {
  83. a[k0++] = v1;
  84. b[k1++] = w1;
  85. lca = v1;
  86. break;
  87. }
  88. }
  89.  
  90. int sz = k0;
  91. for(int i = 0; i < sz; i++)
  92. {
  93. if(a[i] == lca)
  94. {
  95. break;
  96. }
  97. path[k2++] = a[i];
  98. }
  99. path[k2++] = lca;
  100. sz = k1;
  101. int temp = 0;
  102. for(ll i = 0; i < sz; i++)
  103. {
  104. //printf("%d\n", b[i]);
  105. if(b[i] == lca)
  106. {
  107. temp = i - 1;
  108. break;
  109. }
  110. }
  111. for(int i = temp; i >= 0; i--)
  112. {
  113. path[k2++] = b[i];
  114. }
  115. }
  116.  
  117. void manage_traffikant(int v, int w, int value)
  118. {
  119. LCA(v, w);
  120. int sz = k2, temp;
  121. int timer = 0, chetnost = sz + 1;
  122.  
  123. for(int i = 0; i < sz; i++)
  124. {
  125. temp = path[i];
  126. dr[temp][timer][chetnost] += value;
  127. timer++;
  128. }
  129. dr[v][sz][chetnost] += value;
  130. }
  131.  
  132. ll ans_query(int v, int w, ll t1, ll t2)
  133. {
  134. LCA(v, w);
  135. int sz = k2, temp;
  136.  
  137. ll ans = 0, calc = 0, tempSum = 0, modulo = 0;
  138.  
  139. ll c_node = 0;
  140.  
  141. for(int i = 0; i < sz; i++)
  142. {
  143. temp = path[i];
  144.  
  145. //printf("%d\n",temp);
  146.  
  147. c_node = 0;
  148. for(ll j = 0; j <= 21; j++)
  149. {
  150. for(ll z = 1; z <= 21; z++)
  151. {
  152. //printf("%d %d %d\n", temp, j, z);
  153. if(j >= t1 && j <= t2)
  154. {
  155. calc = t2 - j;
  156. tempSum = 1;
  157. if(calc > 0)
  158. {
  159. tempSum += calc / z;
  160. }
  161. ans += tempSum * dr[temp][j][z];
  162. c_node += tempSum * dr[temp][j][z];
  163. //printf("%d %d %d %d\n", temp, j, z, dr[temp][j][z]);
  164. }
  165. else if(j <= t2)
  166. {
  167. modulo = (z - (t1 % z)) + t1;
  168. tempSum = 1;
  169.  
  170. calc = t2 - modulo;
  171. if(calc < 0) continue;
  172. tempSum += calc / z;
  173.  
  174. ans += tempSum * dr[temp][j][z];
  175. c_node += tempSum * dr[temp][j][z];
  176. }
  177. }
  178. }
  179. printf("%d %lld\n", temp, c_node);
  180. }
  181. return ans;
  182. }
  183.  
  184. void query()
  185. {
  186. scanf("%d", &q);
  187.  
  188. int type, v, w;
  189. ll t1, t2;
  190. for(int i = 0; i < q; i++)
  191. {
  192. scanf("%d %d %d", &type, &v, &w);
  193.  
  194. if(type == 1)
  195. {
  196. manage_traffikant(v, w, 1);
  197. }
  198. else if(type == 2)
  199. {
  200. manage_traffikant(v, w, -1);
  201. }
  202. else
  203. {
  204. scanf("%lld %lld", &t1, &t2);
  205. //printf("DAS");
  206. printf("%lld\n", ans_query(v, w, t1, t2));
  207. }
  208. }
  209. }
  210.  
  211. void add_traffikants()
  212. {
  213. scanf("%d", &k);
  214.  
  215. int v, w;
  216. for(int i = 0; i < k; i++)
  217. {
  218. scanf("%d %d", &v, &w);
  219.  
  220. manage_traffikant(v, w, 1);
  221. }
  222. }
  223.  
  224. int main()
  225. {
  226. read_input();
  227. parent[root] = root;
  228. dfs(root);
  229. for(int i = 0; i < k2; i++)
  230. {
  231. printf("%d\n", path[i]);
  232. }
  233. add_traffikants();
  234. query();
  235.  
  236. return 0;
  237. }
  238.  
  239. /*
  240. 5
  241. 1 2
  242. 2 3
  243. 2 4
  244. 1 5
  245. 1
  246. 4 1
  247. 3
  248. 3 3 5 0 3
  249. 1 2 5
  250. 3 4 5 1 5
  251. */
  252.  
  253. /*
  254. 6
  255. 1 2
  256. 1 3
  257. 2 4
  258. 4 5
  259. 4 6
  260. 3
  261. 5 4
  262. 6 4
  263. 4 3
  264. 5
  265. 3 5 3 6 10
  266. */
  267.  
  268. /*
  269. 50
  270. 46 20
  271. 36 13
  272. 1 35
  273. 7 39
  274. 40 47
  275. 13 6
  276. 26 17
  277. 47 18
  278. 34 42
  279. 42 36
  280. 19 16
  281. 17 19
  282. 30 48
  283. 32 11
  284. 6 7
  285. 4 46
  286. 48 44
  287. 10 4
  288. 37 43
  289. 23 41
  290. 33 28
  291. 22 38
  292. 44 45
  293. 28 3
  294. 20 33
  295. 21 49
  296. 25 32
  297. 8 31
  298. 39 26
  299. 18 30
  300. 24 10
  301. 45 1
  302. 41 8
  303. 15 25
  304. 27 40
  305. 31 5
  306. 3 50
  307. 14 37
  308. 9 15
  309. 16 21
  310. 43 22
  311. 49 14
  312. 35 9
  313. 12 29
  314. 50 34
  315. 5 24
  316. 38 2
  317. 29 23
  318. 11 12
  319. 50
  320. 41 24
  321. 50 22
  322. 3 37
  323. 35 41
  324. 39 22
  325. 28 28
  326. 28 13
  327. 20 26
  328. 29 23
  329. 44 46
  330. 1 33
  331. 41 44
  332. 4 26
  333. 26 38
  334. 38 37
  335. 33 4
  336. 5 48
  337. 27 1
  338. 19 20
  339. 49 19
  340. 34 11
  341. 23 5
  342. 7 37
  343. 21 21
  344. 44 46
  345. 1 20
  346. 5 23
  347. 16 24
  348. 12 44
  349. 40 44
  350. 48 5
  351. 6 42
  352. 26 22
  353. 9 24
  354. 14 17
  355. 41 48
  356. 8 48
  357. 31 23
  358. 15 48
  359. 41 35
  360. 24 25
  361. 40 18
  362. 46 15
  363. 13 42
  364. 35 31
  365. 37 6
  366. 50 50
  367. 12 42
  368. 47 47
  369. 41 23
  370. 50
  371. 3 43 44 5 8
  372. 1 29 41
  373. 3 38 47 7 9
  374. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement