Advertisement
skimono

Untitled

Sep 19th, 2023
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.32 KB | None | 0 0
  1. #pragma GCC optimize("Ofast") // ������������ ���������, �� ��� ������
  2. #pragma GCC optimize("no-stack-protector") //�����
  3. #pragma GCC optimize("unroll-loops") // � ���� ���� ��� �� 100 �� ������ ����� � ��������� �� ��� � 100 ��� �� ������ ��������
  4. #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native") // ��� ����� ����� �� ��� 03 02 ��������� � ������ ������� �������� ��� ���� ������������
  5. #pragma GCC optimize("fast-math")
  6. #define _CRT_SECURE_NO_WARNINGS
  7.  
  8. #include <iostream>
  9. #include <vector>
  10. #include <string>
  11. #include <algorithm>
  12. #include <cmath>
  13. #include <stack>
  14. #include <iomanip>
  15. #include <fstream>
  16. #include <string>
  17. #include <set>
  18. #include <deque>
  19. #include <queue>
  20. #include <map>
  21. #include <bitset>
  22. #include <random>
  23. #include <list>
  24. #include <unordered_map>
  25. #include <unordered_set>
  26. #include <cassert>
  27.  
  28. using namespace std;
  29.  
  30. typedef long long ll;
  31. typedef short sh;
  32. typedef unsigned long long ull;
  33. typedef long double ld;
  34. typedef string str;
  35. //typedef __int128 ultraint;
  36. #define sqrt sqrtl
  37. #define F first
  38. #define S second
  39. #define endl '\n'
  40. #define all(vc666) vc666.begin(), vc666.end()
  41. #define allr(vc666) vc666.rbegin(), vc666.rend()
  42. //#define int long long
  43. #define degug(x) cerr (#x) << " " << (x) << endl;
  44.  
  45. const ll INF = 2e18;
  46. const ll inf = 2e9 + 3;
  47. const ll ONE = 1, ZERO = 0;
  48. const ll mod = 998244353;
  49. const ll m1 = 1e9 + 575179;
  50. const ll m2 = 1e9 + 87;
  51. const ll LG = 19;
  52. const ll k_mo = 347;
  53. const ll k_sqrt = 347;
  54. const ll p = 79;
  55. ld EPS = 1e-9;
  56. ld PI = 3.1415926535897932384;
  57. ld phi = (sqrt(5) + 1.0) / 2.0;
  58. mt19937_64 rnd(4906);
  59.  
  60. struct Query {
  61.     int l, r, id;
  62. };
  63.  
  64. const int N = 1e5 + 10;
  65. vector <pair <int, int> > g[N];//Graph
  66. vector <pair <int, int> > euler_path;//Euler_obhod
  67. int idx[N];//Position of vertex
  68. int ans[N];//Answer of query
  69. int bl[(N + k_sqrt - 1) / k_sqrt][k_sqrt];
  70. int res[(N + k_sqrt - 1) / k_sqrt];
  71. int cnt[N];
  72. vector <Query> Q[(3 * N + k_mo - 1) / k_mo];
  73.  
  74. //sqrt_decomposition for mex_answer
  75. void add(int x) {
  76.     bl[x / k_sqrt][x % k_sqrt]++;
  77.     if (bl[x / k_sqrt][x % k_sqrt] == 1) {
  78.         res[x / k_sqrt]--;
  79.     }
  80. }
  81.  
  82. void ira(int x) {
  83.     bl[x / k_sqrt][x % k_sqrt]--;
  84.     if (bl[x / k_sqrt][x % k_sqrt] == 0) {
  85.         res[x / k_sqrt]++;
  86.     }
  87. }
  88.  
  89. int get_mex() {
  90.     for (int i = 0; true; i++)
  91.         if (res[i] > 0)
  92.             for (int j = 0; true; j++)
  93.                 if (bl[i][j] == 0) return i * k_sqrt + j;
  94. }
  95.  
  96. void dfs(int v, int p, int w) {
  97.     euler_path.push_back({ v, w });
  98.     idx[v] = euler_path.size();
  99.     for (auto u : g[v]) {
  100.         if (u.first == p) continue;
  101.         dfs(u.first, v, u.second);
  102.     }
  103.     euler_path.push_back({ v, w });
  104. }
  105.  
  106. bool cmp(const Query& a, const Query& b) {
  107.     return a.r < b.r;
  108. }
  109.  
  110. void solve() {
  111.     int n, q, u, v, x, i, j, l, r;
  112.     cin >> n >> q;
  113.     for (i = 0; i < n - 1; i++) {
  114.         cin >> u >> v >> x;
  115.         u--, v--;
  116.         g[u].push_back({ v, min(x, N - 1) });
  117.         g[v].push_back({ u, min(x, N - 1) });
  118.     }
  119.     dfs(0, -1, N - 1);
  120.     for (i = 0; i < q; i++) {
  121.         cin >> l >> r;;
  122.         l = idx[l - 1];
  123.         r = idx[r - 1];
  124.         if (l > r) {
  125.             swap(l, r);
  126.         }
  127.         r--;
  128.         Q[l / k_mo].push_back({ l, r, i });
  129.     }
  130.     for (i = 0; i < (euler_path.size() + k_mo - 1) / k_mo; i++) {
  131.         sort(all(Q[i]), cmp);
  132.         l = i * k_mo;
  133.         r = l - 1;
  134.         for (j = 0; j < N; j++) {
  135.             cnt[j] = 0;
  136.             bl[j / k_sqrt][j % k_sqrt] = 0;
  137.             res[j / k_sqrt] = k_sqrt;
  138.         }
  139.         for (auto u : Q[i]) {
  140.             while (r < u.r) {
  141.                 v = euler_path[r + 1].first;
  142.                 x = euler_path[r + 1].second;
  143.                 cnt[v]++;
  144.                 if (cnt[v] == 1) {
  145.                     add(x);
  146.                 }
  147.                 else {
  148.                     ira(x);
  149.                 }
  150.                 r++;
  151.             }
  152.             while (l < u.l) {
  153.                 v = euler_path[l].first;
  154.                 x = euler_path[l].second;
  155.                 cnt[v]--;
  156.                 if (cnt[v] == 1) {
  157.                     add(x);
  158.                 }
  159.                 else {
  160.                     ira(x);
  161.                 }
  162.                 l++;
  163.             }
  164.             while (l > u.l) {
  165.                 v = euler_path[l - 1].first;
  166.                 x = euler_path[l - 1].second;
  167.                 cnt[v]++;
  168.                 if (cnt[v] == 1) {
  169.                     add(x);
  170.                 }
  171.                 else {
  172.                     ira(x);
  173.                 }
  174.                 l--;
  175.             }
  176.             ans[u.id] = get_mex();
  177.         }
  178.     }
  179.     for (i = 0; i < q; i++) {
  180.         cout << ans[i] << endl;
  181.     }
  182. }
  183.  
  184. signed main() {
  185. #ifdef _DEBUG
  186.     freopen("input.txt", "r ", stdin);
  187.     freopen("output.txt", "w", stdout);
  188. #endif
  189.     ios_base::sync_with_stdio(0);
  190.     cin.tie(NULL);
  191.     cout.tie(NULL);
  192.     int t = 1;
  193.     //cin >> t;
  194.     while (t--) solve();
  195. }
  196. //Deisgned by skimono
  197. //Клуб "Кольца(Серьги)"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement