Advertisement
Guest User

Ilya ( Mars )

a guest
Nov 15th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. #include <functional>
  5. #include <utility>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <cassert>
  9.  
  10. #include <vector>
  11. #include <set>
  12. #include <queue>
  13. #include <map>
  14. #include <stack>
  15. #include <unordered_map>
  16.  
  17. #include <string>
  18. #include <iterator>
  19. #include <iomanip>
  20. #include <fstream>
  21.  
  22. #include <random>
  23. #include <chrono>
  24.  
  25. using namespace std;
  26.  
  27. #define uint unsigned int
  28. #define prll pair<ll,ll>
  29. #define prdd pair<double,double>
  30. #define m_p make_pair
  31. #define ticonst (ll)1337228
  32. #define INF (ll)1e18
  33. #define ll long long
  34.  
  35. const ll q = 239053;
  36. const ll mod = 1e9 + 7;
  37. const ll mod2 = 1e9 + 13;
  38. const ll MAXN = 2e5 + 100;
  39. const ll MAXM = 4294967291;
  40. const ll L = 20;
  41.  
  42. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  43. // if(clock() / (double)CLOCKS_PER_SEC >= t.0)
  44.  
  45.  
  46. ll tin[MAXN], tout[MAXN], sz[MAXN];
  47. ll up[MAXN][L];
  48. vector<prll> g[MAXN];
  49.  
  50. ll head[MAXN], down[MAXN], pr[MAXN];
  51.  
  52. ll n, m;
  53.  
  54. void calc(ll a, ll p)
  55. {
  56.     pr[a] = p;
  57.     up[a][0] = p;
  58.  
  59.     for (ll i = 1; i < L; ++i)
  60.         up[a][i] = up[up[a][i - 1]][i - 1];
  61. }
  62.  
  63. vector<ll> r;
  64.  
  65. ll t = 0;
  66. void dfs(ll v, ll p)
  67. {
  68.     tin[v] = t++;
  69.  
  70.     calc(v, p);
  71.  
  72.     for (ll j = 0; j < (ll)g[v].size(); ++j)
  73.     {
  74.         ll to = g[v][j].first;
  75.  
  76.         if (to == p)
  77.             continue;
  78.  
  79.         head[to] = (!j ? head[v] : to);
  80.         ++down[head[to]];
  81.  
  82.         r[t] = g[v][j].second;
  83.  
  84.         dfs(to, v);
  85.     }
  86.  
  87.     tout[v] = t++;
  88. }
  89.  
  90. bool upper(ll a, ll b)
  91. {
  92.     return (tin[a] <= tin[b] && tout[b] <= tout[a]);
  93. }
  94.  
  95. ll lca(ll a, ll b)
  96. {
  97.     if (upper(a, b))
  98.         return a;
  99.     if (upper(b, a))
  100.         return b;
  101.  
  102.     for (ll i = L - 1; i >= 0; --i)
  103.         if (!upper(up[a][i], b))
  104.             a = up[a][i];
  105.  
  106.     return up[a][0];
  107. }
  108.  
  109. void repair(ll v, ll p)
  110. {
  111.     if (g[v][0].first == p)
  112.         swap(g[v][0], g[v][(ll)g[v].size() - 1]);
  113.  
  114.     for (ll j = 0; j < (ll)g[v].size(); ++j)
  115.     {
  116.         ll to = g[v][j].first;
  117.  
  118.         if (to == p)
  119.             continue;
  120.  
  121.         repair(to, v);
  122.         sz[v] += sz[to];
  123.  
  124.         if (sz[to] > sz[g[v][0].first])
  125.             swap(g[v][0], g[v][j]);
  126.     }
  127. }
  128.  
  129. struct SegTree
  130. {
  131.     ll s;
  132.     vector<vector<ll>> t;
  133.  
  134.     void update(ll  v)
  135.     {
  136.         ll nwn = (ll)t[v * 2].size() + (ll)t[v * 2 + 1].size();
  137.         t[v].resize(nwn);
  138.  
  139.         merge(t[v * 2].begin(), t[v * 2].end(), t[v * 2 + 1].begin(), t[v * 2 + 1].end(), t[v].begin());
  140.     }
  141.  
  142.     void build(ll tl, ll tr, ll v, vector<ll> &a)
  143.     {
  144.         if (tl + 1 == tr)
  145.         {
  146.             t[v].push_back(a[tl]);
  147.             return;
  148.         }
  149.  
  150.         ll mid = (tr + tl) >> 1;
  151.  
  152.         build(tl, mid, v * 2, a);
  153.         build(mid, tr, v * 2 + 1, a);
  154.  
  155.         update(v);
  156.     }
  157.  
  158.     SegTree(vector<ll> &v)
  159.     {
  160.         ll dop = (ll)v.size();
  161.         s = dop;
  162.  
  163.         t.resize(4 * s);
  164.  
  165.         build(0, s, 1, v);
  166.     }
  167.  
  168.     ll get(ll tl, ll tr, ll l, ll r, ll v, ll x)
  169.     {
  170.         if (tl >= r || tr <= l)
  171.             return 0;
  172.         if (l <= tl && tr <= r)
  173.         {
  174.             auto it = upper_bound(t[v].begin(), t[v].end(), x);
  175.             return it - t[v].begin();
  176.         }
  177.  
  178.         ll mid = (tr + tl) >> 1;
  179.         return get(tl, mid, l, r, v * 2, x) + get(mid, tr, l, r, v * 2 + 1, x);
  180.     }
  181.  
  182.     ll get(ll l, ll r, ll x)
  183.     {
  184.         return get(0, s, l, r + 1, 1, x);
  185.     }
  186.  
  187. };
  188.  
  189. ll k_pred(ll v, ll k)
  190. {
  191.     for (ll i = L - 1; i >= 0; --i)
  192.     {
  193.         ll st = (1ll < i);
  194.         if (st <= k)
  195.         {
  196.             k -= st;
  197.  
  198.             v = up[v][i];
  199.         }
  200.     }
  201.  
  202.     return v;
  203. }
  204.  
  205. ll supa(ll &a, ll b, ll x, SegTree &u_tree)
  206. {
  207.     if (head[a] == a)
  208.     {
  209.         ll aa = a;
  210.         a = pr[a];
  211.  
  212.         return r[tin[aa]] <= x;
  213.     }
  214.  
  215.     ll root = head[a];
  216.     ll r = tin[a], l = max(tin[b], tin[root]);
  217.  
  218.     a = root;
  219.     return u_tree.get(l + 1, r, x);
  220. }
  221.  
  222. void $main()
  223. {
  224.     cin >> n >> m;
  225.  
  226.     for (ll i = 0; i < n; ++i)
  227.         sz[i] = 1;
  228.  
  229.     r.resize(2 * n + 100);
  230.  
  231.     for (ll i = 0; i < n - 1; ++i)
  232.     {
  233.         ll u, v, c; cin >> u >> v >> c;
  234.         --u; --v;
  235.  
  236.         g[u].emplace_back(v, c);
  237.         g[v].emplace_back(u, c);
  238.     }
  239.  
  240.     repair(0, 0);
  241.  
  242.     dfs(0, 0);
  243.  
  244.     for (ll &el : r)
  245.         if (!el)
  246.             el = INF;
  247.  
  248.  
  249.     SegTree tree = SegTree(r);
  250.  
  251.     for (ll i = 0; i < m; ++i)
  252.     {
  253.         ll u, v, x; cin >> u >> v >> x;
  254.         --u; --v;
  255.  
  256.         ll _lca = lca(u, v);
  257.  
  258.         ll ans = 0;
  259.  
  260.         while (upper(_lca, u) && _lca != u)
  261.             ans += supa(u, _lca, x, tree);
  262.  
  263.         while (upper(_lca, v) && _lca != v)
  264.             ans += supa(v, _lca, x, tree);
  265.  
  266.         cout << ans << '\n';
  267.     }
  268.  
  269. }
  270.  
  271. int main()
  272. {
  273. #ifndef ONLINE_JUDGE
  274.     freopen("input.txt", "r", stdin);
  275. #else
  276.     //freopen("wizard.in", "r", stdin);
  277.     //freopen("wizard.out", "w", stdout);
  278. #endif
  279.     ios_base::sync_with_stdio(0);
  280.     cin.tie(0), cout.tie(0);
  281.  
  282.     $main();
  283.  
  284.     return 0;
  285. }
  286.  
  287. //257593BA
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement