QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#276165#6737. NeighbourhoodmaspyAC ✓6339ms67912kbC++2028.8kb2023-12-05 17:11:592023-12-05 17:12:00

Judging History

你现在查看的是最新测评结果

  • [2023-12-05 17:12:00]
  • 评测
  • 测评结果:AC
  • 用时:6339ms
  • 内存:67912kb
  • [2023-12-05 17:11:59]
  • 提交

answer

#line 1 "library/my_template.hpp"
#if defined(LOCAL)
#include <my_template_compiled.hpp>
#else
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using u32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;
using u128 = unsigned __int128;
using f128 = __float128;

template <class T>
constexpr T infty = 0;
template <>
constexpr int infty<int> = 1'000'000'000;
template <>
constexpr ll infty<ll> = ll(infty<int>) * infty<int> * 2;
template <>
constexpr u32 infty<u32> = infty<int>;
template <>
constexpr u64 infty<u64> = infty<ll>;
template <>
constexpr i128 infty<i128> = i128(infty<ll>) * infty<ll>;
template <>
constexpr double infty<double> = infty<ll>;
template <>
constexpr long double infty<long double> = infty<ll>;

using pi = pair<ll, ll>;
using vi = vector<ll>;
template <class T>
using vc = vector<T>;
template <class T>
using vvc = vector<vc<T>>;
template <class T>
using vvvc = vector<vvc<T>>;
template <class T>
using vvvvc = vector<vvvc<T>>;
template <class T>
using vvvvvc = vector<vvvvc<T>>;
template <class T>
using pq = priority_queue<T>;
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

#define vv(type, name, h, ...) \
  vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...)   \
  vector<vector<vector<type>>> name( \
      h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...)       \
  vector<vector<vector<vector<type>>>> name( \
      a, vector<vector<vector<type>>>(       \
             b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))

// https://trap.jp/post/1224/
#define FOR1(a) for (ll _ = 0; _ < ll(a); ++_)
#define FOR2(i, a) for (ll i = 0; i < ll(a); ++i)
#define FOR3(i, a, b) for (ll i = a; i < ll(b); ++i)
#define FOR4(i, a, b, c) for (ll i = a; i < ll(b); i += (c))
#define FOR1_R(a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR2_R(i, a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR3_R(i, a, b) for (ll i = (b)-1; i >= ll(a); --i)
#define overload4(a, b, c, d, e, ...) e
#define overload3(a, b, c, d, ...) d
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FOR_R(...) overload3(__VA_ARGS__, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__)

#define FOR_subset(t, s) \
  for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s)))
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define elif else if

#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second

#define stoi stoll

int popcnt(int x) { return __builtin_popcount(x); }
int popcnt(u32 x) { return __builtin_popcount(x); }
int popcnt(ll x) { return __builtin_popcountll(x); }
int popcnt(u64 x) { return __builtin_popcountll(x); }
int popcnt_mod_2(int x) { return __builtin_parity(x); }
int popcnt_mod_2(u32 x) { return __builtin_parity(x); }
int popcnt_mod_2(ll x) { return __builtin_parityll(x); }
int popcnt_mod_2(u64 x) { return __builtin_parityll(x); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 1, 2)
int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(u32 x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(ll x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
int topbit(u64 x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 0, 2)
int lowbit(int x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(u32 x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(ll x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
int lowbit(u64 x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }

template <typename T>
T floor(T a, T b) {
  return a / b - (a % b && (a ^ b) < 0);
}
template <typename T>
T ceil(T x, T y) {
  return floor(x + y - 1, y);
}
template <typename T>
T bmod(T x, T y) {
  return x - y * floor(x, y);
}
template <typename T>
pair<T, T> divmod(T x, T y) {
  T q = floor(x, y);
  return {q, x - q * y};
}

template <typename T, typename U>
T SUM(const vector<U> &A) {
  T sm = 0;
  for (auto &&a: A) sm += a;
  return sm;
}

#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define LB(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define UB(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define UNIQUE(x) \
  sort(all(x)), x.erase(unique(all(x)), x.end()), x.shrink_to_fit()

template <typename T>
T POP(deque<T> &que) {
  T a = que.front();
  que.pop_front();
  return a;
}
template <typename T>
T POP(pq<T> &que) {
  T a = que.top();
  que.pop();
  return a;
}
template <typename T>
T POP(pqg<T> &que) {
  T a = que.top();
  que.pop();
  return a;
}
template <typename T>
T POP(vc<T> &que) {
  T a = que.back();
  que.pop_back();
  return a;
}

template <typename F>
ll binary_search(F check, ll ok, ll ng, bool check_ok = true) {
  if (check_ok) assert(check(ok));
  while (abs(ok - ng) > 1) {
    auto x = (ng + ok) / 2;
    (check(x) ? ok : ng) = x;
  }
  return ok;
}
template <typename F>
double binary_search_real(F check, double ok, double ng, int iter = 100) {
  FOR(iter) {
    double x = (ok + ng) / 2;
    (check(x) ? ok : ng) = x;
  }
  return (ok + ng) / 2;
}

template <class T, class S>
inline bool chmax(T &a, const S &b) {
  return (a < b ? a = b, 1 : 0);
}
template <class T, class S>
inline bool chmin(T &a, const S &b) {
  return (a > b ? a = b, 1 : 0);
}

// ? は -1
vc<int> s_to_vi(const string &S, char first_char) {
  vc<int> A(S.size());
  FOR(i, S.size()) { A[i] = (S[i] != '?' ? S[i] - first_char : -1); }
  return A;
}

template <typename T, typename U>
vector<T> cumsum(vector<U> &A, int off = 1) {
  int N = A.size();
  vector<T> B(N + 1);
  FOR(i, N) { B[i + 1] = B[i] + A[i]; }
  if (off == 0) B.erase(B.begin());
  return B;
}

// stable sort
template <typename T>
vector<int> argsort(const vector<T> &A) {
  vector<int> ids(len(A));
  iota(all(ids), 0);
  sort(all(ids),
       [&](int i, int j) { return (A[i] == A[j] ? i < j : A[i] < A[j]); });
  return ids;
}

// A[I[0]], A[I[1]], ...
template <typename T>
vc<T> rearrange(const vc<T> &A, const vc<int> &I) {
  vc<T> B(len(I));
  FOR(i, len(I)) B[i] = A[I[i]];
  return B;
}
#endif
#line 1 "library/other/io.hpp"
#define FASTIO
#include <unistd.h>

// https://judge.yosupo.jp/submission/21623
namespace fastio {
static constexpr uint32_t SZ = 1 << 17;
char ibuf[SZ];
char obuf[SZ];
char out[100];
// pointer of ibuf, obuf
uint32_t pil = 0, pir = 0, por = 0;

struct Pre {
  char num[10000][4];
  constexpr Pre() : num() {
    for (int i = 0; i < 10000; i++) {
      int n = i;
      for (int j = 3; j >= 0; j--) {
        num[i][j] = n % 10 | '0';
        n /= 10;
      }
    }
  }
} constexpr pre;

inline void load() {
  memcpy(ibuf, ibuf + pil, pir - pil);
  pir = pir - pil + fread(ibuf + pir - pil, 1, SZ - pir + pil, stdin);
  pil = 0;
  if (pir < SZ) ibuf[pir++] = '\n';
}

inline void flush() {
  fwrite(obuf, 1, por, stdout);
  por = 0;
}

void rd(char &c) {
  do {
    if (pil + 1 > pir) load();
    c = ibuf[pil++];
  } while (isspace(c));
}

void rd(string &x) {
  x.clear();
  char c;
  do {
    if (pil + 1 > pir) load();
    c = ibuf[pil++];
  } while (isspace(c));
  do {
    x += c;
    if (pil == pir) load();
    c = ibuf[pil++];
  } while (!isspace(c));
}

template <typename T>
void rd_real(T &x) {
  string s;
  rd(s);
  x = stod(s);
}

template <typename T>
void rd_integer(T &x) {
  if (pil + 100 > pir) load();
  char c;
  do
    c = ibuf[pil++];
  while (c < '-');
  bool minus = 0;
  if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
    if (c == '-') { minus = 1, c = ibuf[pil++]; }
  }
  x = 0;
  while ('0' <= c) { x = x * 10 + (c & 15), c = ibuf[pil++]; }
  if constexpr (is_signed<T>::value || is_same_v<T, i128>) {
    if (minus) x = -x;
  }
}

void rd(int &x) { rd_integer(x); }
void rd(ll &x) { rd_integer(x); }
void rd(i128 &x) { rd_integer(x); }
void rd(u32 &x) { rd_integer(x); }
void rd(u64 &x) { rd_integer(x); }
void rd(u128 &x) { rd_integer(x); }
void rd(double &x) { rd_real(x); }
void rd(long double &x) { rd_real(x); }
void rd(f128 &x) { rd_real(x); }

template <class T, class U>
void rd(pair<T, U> &p) {
  return rd(p.first), rd(p.second);
}
template <size_t N = 0, typename T>
void rd_tuple(T &t) {
  if constexpr (N < std::tuple_size<T>::value) {
    auto &x = std::get<N>(t);
    rd(x);
    rd_tuple<N + 1>(t);
  }
}
template <class... T>
void rd(tuple<T...> &tpl) {
  rd_tuple(tpl);
}

template <size_t N = 0, typename T>
void rd(array<T, N> &x) {
  for (auto &d: x) rd(d);
}
template <class T>
void rd(vc<T> &x) {
  for (auto &d: x) rd(d);
}

void read() {}
template <class H, class... T>
void read(H &h, T &... t) {
  rd(h), read(t...);
}

void wt(const char c) {
  if (por == SZ) flush();
  obuf[por++] = c;
}
void wt(const string s) {
  for (char c: s) wt(c);
}
void wt(const char *s) {
  size_t len = strlen(s);
  for (size_t i = 0; i < len; i++) wt(s[i]);
}

template <typename T>
void wt_integer(T x) {
  if (por > SZ - 100) flush();
  if (x < 0) { obuf[por++] = '-', x = -x; }
  int outi;
  for (outi = 96; x >= 10000; outi -= 4) {
    memcpy(out + outi, pre.num[x % 10000], 4);
    x /= 10000;
  }
  if (x >= 1000) {
    memcpy(obuf + por, pre.num[x], 4);
    por += 4;
  } else if (x >= 100) {
    memcpy(obuf + por, pre.num[x] + 1, 3);
    por += 3;
  } else if (x >= 10) {
    int q = (x * 103) >> 10;
    obuf[por] = q | '0';
    obuf[por + 1] = (x - q * 10) | '0';
    por += 2;
  } else
    obuf[por++] = x | '0';
  memcpy(obuf + por, out + outi + 4, 96 - outi);
  por += 96 - outi;
}

template <typename T>
void wt_real(T x) {
  ostringstream oss;
  oss << fixed << setprecision(15) << double(x);
  string s = oss.str();
  wt(s);
}

void wt(int x) { wt_integer(x); }
void wt(ll x) { wt_integer(x); }
void wt(i128 x) { wt_integer(x); }
void wt(u32 x) { wt_integer(x); }
void wt(u64 x) { wt_integer(x); }
void wt(u128 x) { wt_integer(x); }
void wt(double x) { wt_real(x); }
void wt(long double x) { wt_real(x); }
void wt(f128 x) { wt_real(x); }

template <class T, class U>
void wt(const pair<T, U> val) {
  wt(val.first);
  wt(' ');
  wt(val.second);
}
template <size_t N = 0, typename T>
void wt_tuple(const T t) {
  if constexpr (N < std::tuple_size<T>::value) {
    if constexpr (N > 0) { wt(' '); }
    const auto x = std::get<N>(t);
    wt(x);
    wt_tuple<N + 1>(t);
  }
}
template <class... T>
void wt(tuple<T...> tpl) {
  wt_tuple(tpl);
}
template <class T, size_t S>
void wt(const array<T, S> val) {
  auto n = val.size();
  for (size_t i = 0; i < n; i++) {
    if (i) wt(' ');
    wt(val[i]);
  }
}
template <class T>
void wt(const vector<T> val) {
  auto n = val.size();
  for (size_t i = 0; i < n; i++) {
    if (i) wt(' ');
    wt(val[i]);
  }
}

void print() { wt('\n'); }
template <class Head, class... Tail>
void print(Head &&head, Tail &&... tail) {
  wt(head);
  if (sizeof...(Tail)) wt(' ');
  print(forward<Tail>(tail)...);
}

// gcc expansion. called automaticall after main.
void __attribute__((destructor)) _d() { flush(); }
} // namespace fastio
using fastio::read;
using fastio::print;
using fastio::flush;

#define INT(...)   \
  int __VA_ARGS__; \
  read(__VA_ARGS__)
#define LL(...)   \
  ll __VA_ARGS__; \
  read(__VA_ARGS__)
#define U32(...)   \
  u32 __VA_ARGS__; \
  read(__VA_ARGS__)
#define U64(...)   \
  u64 __VA_ARGS__; \
  read(__VA_ARGS__)
#define STR(...)      \
  string __VA_ARGS__; \
  read(__VA_ARGS__)
#define CHAR(...)   \
  char __VA_ARGS__; \
  read(__VA_ARGS__)
#define DBL(...)      \
  double __VA_ARGS__; \
  read(__VA_ARGS__)

#define VEC(type, name, size) \
  vector<type> name(size);    \
  read(name)
#define VV(type, name, h, w)                     \
  vector<vector<type>> name(h, vector<type>(w)); \
  read(name)

void YES(bool t = 1) { print(t ? "YES" : "NO"); }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { print(t ? "Yes" : "No"); }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { print(t ? "yes" : "no"); }
void no(bool t = 1) { yes(!t); }
#line 3 "main.cpp"

#line 2 "library/graph/base.hpp"

template <typename T>
struct Edge {
  int frm, to;
  T cost;
  int id;
};

template <typename T = int, bool directed = false>
struct Graph {
  static constexpr bool is_directed = directed;
  int N, M;
  using cost_type = T;
  using edge_type = Edge<T>;
  vector<edge_type> edges;
  vector<int> indptr;
  vector<edge_type> csr_edges;
  vc<int> vc_deg, vc_indeg, vc_outdeg;
  bool prepared;

  class OutgoingEdges {
  public:
    OutgoingEdges(const Graph* G, int l, int r) : G(G), l(l), r(r) {}

    const edge_type* begin() const {
      if (l == r) { return 0; }
      return &G->csr_edges[l];
    }

    const edge_type* end() const {
      if (l == r) { return 0; }
      return &G->csr_edges[r];
    }

  private:
    const Graph* G;
    int l, r;
  };

  bool is_prepared() { return prepared; }

  Graph() : N(0), M(0), prepared(0) {}
  Graph(int N) : N(N), M(0), prepared(0) {}

  void build(int n) {
    N = n, M = 0;
    prepared = 0;
    edges.clear();
    indptr.clear();
    csr_edges.clear();
    vc_deg.clear();
    vc_indeg.clear();
    vc_outdeg.clear();
  }

  void add(int frm, int to, T cost = 1, int i = -1) {
    assert(!prepared);
    assert(0 <= frm && 0 <= to && to < N);
    if (i == -1) i = M;
    auto e = edge_type({frm, to, cost, i});
    edges.eb(e);
    ++M;
  }

#ifdef FASTIO
  // wt, off
  void read_tree(bool wt = false, int off = 1) { read_graph(N - 1, wt, off); }

  void read_graph(int M, bool wt = false, int off = 1) {
    for (int m = 0; m < M; ++m) {
      INT(a, b);
      a -= off, b -= off;
      if (!wt) {
        add(a, b);
      } else {
        T c;
        read(c);
        add(a, b, c);
      }
    }
    build();
  }
#endif

  void build() {
    assert(!prepared);
    prepared = true;
    indptr.assign(N + 1, 0);
    for (auto&& e: edges) {
      indptr[e.frm + 1]++;
      if (!directed) indptr[e.to + 1]++;
    }
    for (int v = 0; v < N; ++v) { indptr[v + 1] += indptr[v]; }
    auto counter = indptr;
    csr_edges.resize(indptr.back() + 1);
    for (auto&& e: edges) {
      csr_edges[counter[e.frm]++] = e;
      if (!directed)
        csr_edges[counter[e.to]++] = edge_type({e.to, e.frm, e.cost, e.id});
    }
  }

  OutgoingEdges operator[](int v) const {
    assert(prepared);
    return {this, indptr[v], indptr[v + 1]};
  }

  vc<int> deg_array() {
    if (vc_deg.empty()) calc_deg();
    return vc_deg;
  }

  pair<vc<int>, vc<int>> deg_array_inout() {
    if (vc_indeg.empty()) calc_deg_inout();
    return {vc_indeg, vc_outdeg};
  }

  int deg(int v) {
    if (vc_deg.empty()) calc_deg();
    return vc_deg[v];
  }

  int in_deg(int v) {
    if (vc_indeg.empty()) calc_deg_inout();
    return vc_indeg[v];
  }

  int out_deg(int v) {
    if (vc_outdeg.empty()) calc_deg_inout();
    return vc_outdeg[v];
  }

#ifdef FASTIO
  void debug() {
    print("Graph");
    if (!prepared) {
      print("frm to cost id");
      for (auto&& e: edges) print(e.frm, e.to, e.cost, e.id);
    } else {
      print("indptr", indptr);
      print("frm to cost id");
      FOR(v, N) for (auto&& e: (*this)[v]) print(e.frm, e.to, e.cost, e.id);
    }
  }
#endif

  vc<int> new_idx;
  vc<bool> used_e;

  // G における頂点 V[i] が、新しいグラフで i になるようにする
  // {G, es}
  Graph<T, directed> rearrange(vc<int> V, bool keep_eid = 0) {
    if (len(new_idx) != N) new_idx.assign(N, -1);
    if (len(used_e) != M) used_e.assign(M, 0);
    int n = len(V);
    FOR(i, n) new_idx[V[i]] = i;
    Graph<T, directed> G(n);
    vc<int> history;
    FOR(i, n) {
      for (auto&& e: (*this)[V[i]]) {
        if (used_e[e.id]) continue;
        int a = e.frm, b = e.to;
        if (new_idx[a] != -1 && new_idx[b] != -1) {
          history.eb(e.id);
          used_e[e.id] = 1;
          int eid = (keep_eid ? e.id : -1);
          G.add(new_idx[a], new_idx[b], e.cost, eid);
        }
      }
    }
    FOR(i, n) new_idx[V[i]] = -1;
    for (auto&& eid: history) used_e[eid] = 0;
    G.build();
    return G;
  }

private:
  void calc_deg() {
    assert(vc_deg.empty());
    vc_deg.resize(N);
    for (auto&& e: edges) vc_deg[e.frm]++, vc_deg[e.to]++;
  }

  void calc_deg_inout() {
    assert(vc_indeg.empty());
    vc_indeg.resize(N);
    vc_outdeg.resize(N);
    for (auto&& e: edges) { vc_indeg[e.to]++, vc_outdeg[e.frm]++; }
  }
};
#line 3 "library/graph/shortest_path/bfs01.hpp"

template <typename T, typename GT>
pair<vc<T>, vc<int>> bfs01(GT& G, int v) {
  assert(G.is_prepared());
  int N = G.N;
  vc<T> dist(N, infty<T>);
  vc<int> par(N, -1);
  deque<int> que;

  dist[v] = 0;
  que.push_front(v);
  while (!que.empty()) {
    auto v = que.front();
    que.pop_front();
    for (auto&& e: G[v]) {
      if (dist[e.to] == infty<T> || dist[e.to] > dist[e.frm] + e.cost) {
        dist[e.to] = dist[e.frm] + e.cost;
        par[e.to] = e.frm;
        if (e.cost == 0)
          que.push_front(e.to);
        else
          que.push_back(e.to);
      }
    }
  }
  return {dist, par};
}

// 多点スタート。[dist, par, root]
template <typename T, typename GT>
tuple<vc<T>, vc<int>, vc<int>> bfs01(GT& G, vc<int> vs) {
  assert(G.is_prepared());
  int N = G.N;
  vc<T> dist(N, infty<T>);
  vc<int> par(N, -1);
  vc<int> root(N, -1);
  deque<int> que;

  for (auto&& v: vs) {
    dist[v] = 0;
    root[v] = v;
    que.push_front(v);
  }

  while (!que.empty()) {
    auto v = que.front();
    que.pop_front();
    for (auto&& e: G[v]) {
      if (dist[e.to] == infty<T> || dist[e.to] > dist[e.frm] + e.cost) {
        dist[e.to] = dist[e.frm] + e.cost;
        root[e.to] = root[e.frm];
        par[e.to] = e.frm;
        if (e.cost == 0)
          que.push_front(e.to);
        else
          que.push_back(e.to);
      }
    }
  }
  return {dist, par, root};
}
#line 3 "library/graph/centroid_decomposition.hpp"

/*
頂点ベースの重心分解
f(par, V, indptr)
*/
template <typename F>
void centroid_decomposition_0_dfs(vc<int>& par, vc<int>& vs, F f) {
  const int N = len(par);
  assert(N >= 1);
  int c = -1;
  vc<int> sz(N, 1);
  FOR_R(i, N) {
    if (sz[i] >= ceil<int>(N, 2)) {
      c = i;
      break;
    }
    sz[par[i]] += sz[i];
  }
  vc<int> color(N);
  vc<int> V = {c};
  int nc = 1;
  FOR(v, 1, N) {
    if (par[v] == c) { V.eb(v), color[v] = nc++; }
  }
  if (c > 0) {
    for (int a = par[c]; a != -1; a = par[a]) { color[a] = nc, V.eb(a); }
    ++nc;
  }
  FOR(i, N) {
    if (i != c && color[i] == 0) color[i] = color[par[i]], V.eb(i);
  }
  vc<int> indptr(nc + 1);
  FOR(i, N) indptr[1 + color[i]]++;
  FOR(i, nc) indptr[i + 1] += indptr[i];
  vc<int> counter = indptr;
  vc<int> ord(N);
  for (auto& v: V) { ord[counter[color[v]]++] = v; }
  vc<int> new_idx(N);
  FOR(i, N) new_idx[ord[i]] = i;
  vc<int> name(N);
  FOR(i, N) name[new_idx[i]] = vs[i];
  {
    vc<int> tmp(N, -1);
    FOR(i, 1, N) {
      int a = new_idx[i], b = new_idx[par[i]];
      if (a > b) swap(a, b);
      tmp[b] = a;
    }
    swap(par, tmp);
  }
  f(par, name, indptr);
  FOR(k, 1, nc) {
    int L = indptr[k], R = indptr[k + 1];
    vc<int> par1(R - L, -1);
    vc<int> name1(R - L, -1);
    name1[0] = name[0];
    FOR(i, L, R) name1[i - L] = name[i];
    FOR(i, L, R) { par1[i - L] = max(par[i] - L, -1); }
    centroid_decomposition_0_dfs(par1, name1, f);
  }
}

/*
https://maspypy.com/%e9%87%8d%e5%bf%83%e5%88%86%e8%a7%a3%e3%83%bb1-3%e9%87%8d%e5%bf%83%e5%88%86%e8%a7%a3%e3%81%ae%e3%81%8a%e7%b5%b5%e6%8f%8f%e3%81%8d
centroid_decomposition_1:長さ 2 以上のパス全体
f(par, V, n1, n2)
[1,1+n1]: color 1
[1+n1,1+n1+n2]: color 2
*/
template <typename F>
void centroid_decomposition_1_dfs(vc<int>& par, vc<int> vs, F f) {
  const int N = len(par);
  assert(N > 1);
  if (N == 2) { return; }
  int c = -1;
  vc<int> sz(N, 1);
  FOR_R(i, N) {
    if (sz[i] >= ceil<int>(N, 2)) {
      c = i;
      break;
    }
    sz[par[i]] += sz[i];
  }
  vc<int> color(N, -1);
  int take = 0;
  vc<int> ord(N, -1);
  ord[c] = 0;
  int p = 1;
  FOR(v, 1, N) {
    if (par[v] == c && take + sz[v] <= floor<int>(N - 1, 2)) {
      color[v] = 0, ord[v] = p++, take += sz[v];
    }
  }
  FOR(i, 1, N) {
    if (color[par[i]] == 0) color[i] = 0, ord[i] = p++;
  }
  int n0 = p - 1;
  for (int a = par[c]; a != -1; a = par[a]) { color[a] = 1, ord[a] = p++; }
  FOR(i, N) {
    if (i != c && color[i] == -1) color[i] = 1, ord[i] = p++;
  }
  assert(p == N);
  int n1 = N - 1 - n0;
  vc<int> par0(n0 + 1, -1), par1(n1 + 1, -1), par2(N, -1);
  vc<int> V0(n0 + 1), V1(n1 + 1), V2(N);
  FOR(v, N) {
    int i = ord[v];
    V2[i] = vs[v];
    if (color[v] != 1) { V0[i] = vs[v]; }
    if (color[v] != 0) { V1[max(i - n0, 0)] = vs[v]; }
  }
  FOR(v, 1, N) {
    int a = ord[v], b = ord[par[v]];
    if (a > b) swap(a, b);
    par2[b] = a;
    if (color[v] != 1 && color[par[v]] != 1) par0[b] = a;
    if (color[v] != 0 && color[par[v]] != 0)
      par1[max(b - n0, 0)] = max(a - n0, 0);
  }
  f(par2, V2, n0, n1);
  centroid_decomposition_1_dfs(par0, V0, f);
  centroid_decomposition_1_dfs(par1, V1, f);
}

/*
https://maspypy.com/%e9%87%8d%e5%bf%83%e5%88%86%e8%a7%a3%e3%83%bb1-3%e9%87%8d%e5%bf%83%e5%88%86%e8%a7%a3%e3%81%ae%e3%81%8a%e7%b5%b5%e6%8f%8f%e3%81%8d
f(par2, V2, color)
color in [-1,0,1], -1 is virtual.
*/
template <typename F>
void centroid_decomposition_2_dfs(vc<int>& par, vc<int>& vs, vc<int>& real,
                                  F f) {
  const int N = len(par);
  assert(N > 1);
  if (N == 2) {
    if (real[0] && real[1]) {
      vc<int> color = {0, 1};
      f(par, vs, color);
    }
    return;
  }
  int c = -1;
  vc<int> sz(N, 1);
  FOR_R(i, N) {
    if (sz[i] >= ceil<int>(N, 2)) {
      c = i;
      break;
    }
    sz[par[i]] += sz[i];
  }
  vc<int> color(N, -1);
  int take = 0;
  vc<int> ord(N, -1);
  ord[c] = 0;
  int p = 1;
  FOR(v, 1, N) {
    if (par[v] == c && take + sz[v] <= floor<int>(N - 1, 2)) {
      color[v] = 0, ord[v] = p++, take += sz[v];
    }
  }
  FOR(i, 1, N) {
    if (color[par[i]] == 0) color[i] = 0, ord[i] = p++;
  }
  int n0 = p - 1;
  for (int a = par[c]; a != -1; a = par[a]) { color[a] = 1, ord[a] = p++; }
  FOR(i, N) {
    if (i != c && color[i] == -1) color[i] = 1, ord[i] = p++;
  }
  assert(p == N);
  int n1 = N - 1 - n0;
  vc<int> par0(n0 + 1, -1), par1(n1 + 1, -1), par2(N, -1);
  vc<int> V0(n0 + 1), V1(n1 + 1), V2(N);
  vc<int> rea0(n0 + 1), rea1(n1 + 1), rea2(N);
  FOR(v, N) {
    int i = ord[v];
    V2[i] = vs[v], rea2[i] = real[v];
    if (color[v] != 1) { V0[i] = vs[v], rea0[i] = real[v]; }
    if (color[v] != 0) {
      V1[max(i - n0, 0)] = vs[v], rea1[max(i - n0, 0)] = real[v];
    }
  }
  FOR(v, 1, N) {
    int a = ord[v], b = ord[par[v]];
    if (a > b) swap(a, b);
    par2[b] = a;
    if (color[v] != 1 && color[par[v]] != 1) par0[b] = a;
    if (color[v] != 0 && color[par[v]] != 0)
      par1[max(b - n0, 0)] = max(a - n0, 0);
  }
  if (real[c]) {
    color.assign(N, -1);
    color[0] = 0;
    FOR(i, 1, N) color[i] = rea2[i] ? 1 : -1;
    f(par2, V2, color);
    rea0[0] = rea1[0] = rea2[0] = 0;
  }
  color.assign(N, -1);
  FOR(i, 1, N) if (rea2[i]) color[i] = (i <= n0 ? 0 : 1);
  f(par2, V2, color);
  centroid_decomposition_2_dfs(par0, V0, rea0, f);
  centroid_decomposition_2_dfs(par1, V1, rea1, f);
}

// f(par, V, color)
// V: label in original tree, dfs order
// color in [-1,0,1], color=-1: virtual
template <int MODE, typename GT, typename F>
void centroid_decomposition(GT& G, F f) {
  const int N = G.N;
  if (N == 1) return;
  vc<int> V(N), par(N, -1);
  int l = 0, r = 0;
  V[r++] = 0;
  while (l < r) {
    int v = V[l++];
    for (auto& e: G[v]) {
      if (e.to != par[v]) V[r++] = e.to, par[e.to] = v;
    }
  }
  assert(r == N);
  vc<int> new_idx(N);
  FOR(i, N) new_idx[V[i]] = i;
  vc<int> tmp(N, -1);
  FOR(i, 1, N) {
    int j = par[i];
    tmp[new_idx[i]] = new_idx[j];
  }
  swap(par, tmp);
  static_assert(MODE == 0 || MODE == 1 || MODE == 2);
  if constexpr (MODE == 0) { centroid_decomposition_0_dfs(par, V, f); }
  elif constexpr(MODE == 1) { centroid_decomposition_1_dfs(par, V, f); }
  else {
    vc<int> real(N, 1);
    centroid_decomposition_2_dfs(par, V, real, f);
  }
}
#line 7 "main.cpp"

struct Block {
  int N, off;
  vc<ll> A;
  vc<ll> SORTED_A;
  ll lazy = 0;

  Block(vc<ll>& B, int L, int R) : N(R - L), off(L) {
    A = {B.begin() + L, B.begin() + R};
    SORTED_A = A;
    sort(all(SORTED_A));
  }

  void apply(int l, int r, ll x) {
    l -= off, r -= off;
    chmax(l, 0), chmin(r, N);
    if (l >= r) return;
    if (r - l != N) {
      FOR(i, l, r) A[i] += x;
      SORTED_A = A;
      sort(all(SORTED_A));
      return;
    }
    assert(r - l == N);
    lazy += x;
  }

  ll get(int i) { return A[i - off] + lazy; }

  int query(int l, int r, ll x) {
    l -= off, r -= off;
    chmax(l, 0), chmin(r, N);
    if (l >= r) return 0;
    x -= lazy;
    if (r - l == N) { return UB(SORTED_A, x); }
    int cnt = 0;
    FOR(i, l, r) { cnt += (A[i] <= x); }
    return cnt;
  }
};

void solve() {
  INT(N, Q);
  Graph<int, 0> G0(N);
  G0.read_tree(1);
  vc<int> P0 = bfs01<ll>(G0, 0).se;
  vc<int> v_to_e(N, -1);
  FOR(i, 1, N) {
    for (auto& e: G0[i]) {
      if (e.to == P0[i]) v_to_e[i] = e.id;
    }
  }

  vc<tuple<int, int, ll>> QUERY;
  vvc<int> QID(N);
  FOR(q, Q) {
    LL(a, b, c);
    if (a == 1) {
      --b;
      QUERY.eb(a, b, c);
      auto& e = G0.edges[b];
      QID[e.frm].eb(q);
    }
    if (a == 2) {
      --b;
      QUERY.eb(a, b, c);
      QID[b].eb(q);
    }
  }

  vc<int> ANS(Q);
  vc<int> new_idx(N, -1);
  vc<int> new_idx_e(N, -1);

  auto work = [&](vc<int> par, vc<int> V, vc<int> indptr) -> void {
    int n = len(V);
    FOR(i, n) { new_idx[V[i]] = i; }
    Graph<int, 1> G(n);
    vi A(n);
    vc<int> NOW_LEN(n);
    FOR(i, 1, n) {
      int a = V[par[i]], b = V[i];
      int raw_idx = -1;
      if (P0[b] == a) {
        raw_idx = v_to_e[b];
      } else {
        raw_idx = v_to_e[a];
      }
      G.add(par[i], i, G0.edges[raw_idx].cost);
      new_idx_e[raw_idx] = i;
      NOW_LEN[i] = G0.edges[raw_idx].cost;
      A[i] = A[par[i]] + NOW_LEN[i];
    }
    G.build();
    vc<int> ord, LID(n), RID(n);
    auto dfs = [&](auto& dfs, int v) -> void {
      LID[v] = len(ord);
      ord.eb(v);
      for (auto& e: G[v]) dfs(dfs, e.to);
      RID[v] = len(ord);
    };
    dfs(dfs, 0);

    A = rearrange(A, ord);
    vc<int> SUB_L(n), SUB_R(n);
    FOR(i, 1, n) {
      if (par[i] == 0) {
        int a = LID[i], b = RID[i];
        FOR(k, a, b) {
          SUB_L[ord[k]] = a;
          SUB_R[ord[k]] = b;
        }
      }
    }

    // qid, 1, v, x
    // qid, 2, v, x
    vc<tuple<int, int, int, ll>> SUB_QUERY;
    for (auto& v: V) {
      for (auto q: QID[v]) {
        auto [t, a, b] = QUERY[q];
        if (t == 1) {
          int w = new_idx_e[a];
          if (w != -1) {
            SUB_QUERY.eb(q, 1, w, b - NOW_LEN[w]);
            NOW_LEN[w] = b;
          }
        }
        if (t == 2) {
          a = new_idx[a];
          SUB_QUERY.eb(q, 2, a, b);
        }
      }
    }

    int b_sz = sqrt(n);
    int b_num = ceil<int>(n, b_sz);
    vc<Block> BLOCK;
    FOR(b, b_num) {
      int L = b_sz * b;
      int R = min<int>(L + b_sz, n);
      BLOCK.eb(Block(A, L, R));
    }

    auto ADD = [&](int L, int R, ll x) -> void {
      FOR(b, b_num) BLOCK[b].apply(L, R, x);
    };
    auto GET = [&](int i) -> ll {
      int bid = i / b_sz;
      return BLOCK[bid].get(i);
    };
    auto COUNT = [&](int L, int R, ll x) -> int {
      int cnt = 0;
      FOR(b, b_num) cnt += BLOCK[b].query(L, R, x);
      return cnt;
    };

    sort(all(SUB_QUERY));
    for (auto& [q, t, v, x]: SUB_QUERY) {
      if (t == 1) { ADD(LID[v], RID[v], x); }
      if (t == 2) {
        int ans = 0;
        ll xx = x - GET(LID[v]);
        ans += COUNT(0, n, xx);
        ans -= COUNT(SUB_L[v], SUB_R[v], xx);
        ANS[q] += ans;
      }
    }

    // reset
    for (auto& v: V) { new_idx[v] = -1; }
    FOR(i, 1, n) {
      int a = V[par[i]], b = V[i];
      int raw_idx = -1;
      if (P0[b] == a) {
        raw_idx = v_to_e[b];
      } else {
        raw_idx = v_to_e[a];
      }
      new_idx_e[raw_idx] = -1;
    }
  };
  centroid_decomposition<0>(G0, work);

  FOR(q, Q) {
    int t = get<0>(QUERY[q]);
    if (t == 2) print(ANS[q]);
  }
}

signed main() {
  solve();
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3636kb

input:

3 7
1 2 3
2 3 1
2 2 1
2 1 3
2 3 4
1 1 1
2 2 1
2 1 0
2 3 1

output:

2
2
3
3
1
2

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 3701ms
memory: 66324kb

input:

200000 200000
1 2 146181238
2 3 45037818
3 4 176924060
4 5 969365276
5 6 683948619
6 7 356268194
7 8 871634797
8 9 630254480
9 10 283061123
10 11 204904965
11 12 838381393
12 13 516373812
13 14 253862710
14 15 223572474
15 16 114452997
16 17 145251056
17 18 905638436
18 19 375445402
19 20 549829545
...

output:

219
62303
1358
5532
65345
682
11856
120285
4980
5689
2998
2314
18102
8014
20512
2827
113022
74534
159775
14517
17961
21855
8138
265
3336
3251
7023
35187
4932
151611
14338
101
899
117
64441
888
10380
1833
29381
1014
4806
10770
23734
236
37258
2280
14550
2196
38205
80950
80839
4517
74570
13972
95914
7...

result:

ok 99572 numbers

Test #3:

score: 0
Accepted
time: 4099ms
memory: 66880kb

input:

200000 200000
1 2 656062236
2 3 261234277
3 4 723980474
4 5 755233101
5 6 542749909
6 7 9519713
7 8 878661582
8 9 402365775
9 10 9875710
10 11 894863180
11 12 4247155
12 13 287336772
13 14 76881950
14 15 132946165
15 16 174895351
16 17 93681141
17 18 504958771
18 19 372774409
19 20 406716610
20 21 2...

output:

60189
5717
13802
2030
71980
20394
75205
11241
1388
104056
11760
588
4319
49744
8187
29084
507
39561
2286
3138
42602
77393
15811
5709
15417
48109
9596
846
16875
27181
52
11525
5741
2476
34614
4877
24002
85119
171
246
19408
89
806
42261
25552
865
158
70
3444
25736
60977
4454
11905
126842
35189
3858
15...

result:

ok 180067 numbers

Test #4:

score: 0
Accepted
time: 3136ms
memory: 67912kb

input:

200000 200000
1 2 111377160
2 3 892685763
3 4 889507841
4 5 901236774
5 6 834278466
6 7 298553149
7 8 8150218
8 9 390360541
9 10 621635057
10 11 699702261
11 12 606252166
12 13 657657482
13 14 274827098
14 15 206330963
15 16 546124412
16 17 888769586
17 18 921510546
18 19 117645637
19 20 919234429
2...

output:

171
20066
102752
6642
68416
1708
644
62536
7246
7441
3463
13905
613
38743
54559
8959
4615
103272
40246
26304
149
44249
212
123
34390
82218
521
85028
17557
1014
17048
2759
3173
5518
3043
1266
22438
83793
218
27248
24662
134581
9800
16393
39893
727
13548
3
2669
26080
573
411
9172
3642
2111
19478
563
4...

result:

ok 20072 numbers

Test #5:

score: 0
Accepted
time: 4906ms
memory: 61940kb

input:

200000 200000
1 2 657504560
1 3 539914646
2 4 617534421
2 5 145385645
4 6 11287875
4 7 472341345
1 8 114534025
4 9 940656797
5 10 806152132
3 11 623707008
2 12 841303670
10 13 804880741
1 14 35219013
12 15 924229426
2 16 834808041
5 17 118952529
1 18 561626985
9 19 884416843
10 20 604788348
18 21 11...

output:

605
131
199697
199999
34
3
36514
256
21
2
261
181731
199877
199991
3229
6
122767
4374
200000
53327
40
4
7858
175711
200000
132026
169165
72
112
120267
171500
1
95691
36697
199851
200000
6940
662
200000
1
1168
2
200000
19
16
211
9
11
196444
85
42751
200000
11
200000
115222
28279
177665
691
127
197292...

result:

ok 100112 numbers

Test #6:

score: 0
Accepted
time: 2312ms
memory: 67224kb

input:

200000 200000
1 2 525193329
1 3 693042313
1 4 194485999
1 5 319160289
1 6 925926764
1 7 592828271
1 8 262594959
1 9 60806042
1 10 704487773
1 11 963570483
1 12 71530643
1 13 66914391
1 14 933028716
1 15 678371635
1 16 714555824
1 17 507124524
1 18 160041085
1 19 769379790
1 20 938594863
1 21 2405638...

output:

85288
1
28130
1
170364
1
5907
1
71883
1
184882
1
1
1
70569
200000
128205
44921
20408
1
82605
17646
1
1
1
1
22715
1
145387
1
161039
175478
1
200000
105070
1
19679
134568
200000
29028
72699
79367
1
4346
111703
200000
200000
200000
1
1
19607
49417
109205
200000
77104
200000
200000
1
1
1
200000
28475
74...

result:

ok 179761 numbers

Test #7:

score: 0
Accepted
time: 5608ms
memory: 62124kb

input:

200000 200000
1 2 796456214
2 3 740604027
3 4 363664601
4 5 815797615
5 6 463286014
6 7 430082206
7 8 639881106
8 9 14913310
9 10 887879247
10 11 796246680
11 12 802527015
12 13 437002899
13 14 281562336
14 15 688457701
15 16 905558374
16 17 617631127
17 18 193398033
18 19 642019042
19 20 610926873
...

output:

1
94
136
110084
136
35645
135676
200000
38729
11501
9
16200
393
146
132
199986
50
10840
5194
99022
19
150100
200000
11
60695
1673
3
166621
36
98
44
7
7
200000
3055
27
65
27000
47
15214
842
1
41870
17
3213
26
175965
5
99
41
131613
199989
108859
1078
73
35
82388
34
10145
1
1
3
6
31
36
139
199995
46667...

result:

ok 100168 numbers

Test #8:

score: 0
Accepted
time: 430ms
memory: 29588kb

input:

100000 30000
1 2 232632894
2 3 615573029
3 4 812551786
4 5 161942260
5 6 457428876
6 7 89411628
7 8 402198074
8 9 266513672
9 10 866030976
10 11 357259122
11 12 903193100
12 13 702113698
13 14 49435177
14 15 402399859
15 16 280341727
16 17 222276068
17 18 8665747
18 19 33844315
19 20 112069486
20 21...

output:

21672
59783
1586
25348
1774
3133
29699
699
3686
2318
1797
5456
1494
2998
8846
4732
1492
14933
5263
37596
16672
4
8662
1768
20587
70040
100000
9272
10659
25123
16087
1168
1734
144
10726
595
5020
1771
6064
6480
40169
11797
89942
99074
19569
433
5336
764
5706
40
73256
2012
25177
57183
3743
100000
4379
...

result:

ok 2958 numbers

Test #9:

score: 0
Accepted
time: 616ms
memory: 27360kb

input:

100000 30000
1 2 190746238
2 3 675029592
1 4 168040323
1 5 922467464
5 6 361179444
6 7 34395123
1 8 410124233
5 9 960812805
7 10 622220798
1 11 958352127
8 12 38660819
4 13 810644242
13 14 855144641
12 15 329318635
2 16 114496731
9 17 522298672
3 18 557815746
7 19 476566127
19 20 353005409
17 21 438...

output:

3327
96746
100000
100000
2
99459
25780
6
1364
3681
2
99982
21494
100000
100000
648
71
39
99579
100000
2
100000
37698
30633
312
12
29977
100000
100000
15
1
29
1926
4
100000
64460
396
100000
8099
54
511
98678
42
751
489
954
1
1
7206
178
47644
99588
3352
44594
1
100000
62862
1265
4682
412
22
26
100000
...

result:

ok 14890 numbers

Test #10:

score: 0
Accepted
time: 281ms
memory: 28572kb

input:

100000 30000
1 2 354831917
1 3 202905598
1 4 611619647
1 5 20222478
1 6 708756128
1 7 821129867
1 8 893394198
1 9 626738967
1 10 176378473
1 11 54191181
1 12 558850835
1 13 18618138
1 14 713989739
1 15 837205587
1 16 94638856
1 17 662322139
1 18 66448477
1 19 615697398
1 20 259837281
1 21 93808179
1...

output:

1
62583
1
1
100000
93793
64328
100000
1
75867
34018
3072
1
1
91692
94061
2578
1
72165
44133
96303
1
1
100000
3013
78870
43017
87852
1
100000
46541
1
359
30700
100000
26805
1
70202
100000
100000
1
1
33742
92761
100000
55185
28767
100000
90214
100000
35616
1
100000
100000
1
1
2216
100000
15849
1
1
311...

result:

ok 26958 numbers

Test #11:

score: 0
Accepted
time: 694ms
memory: 27336kb

input:

100000 30000
1 2 104249460
2 3 478232035
3 4 466312804
4 5 189561732
5 6 362119693
6 7 53996994
7 8 566013752
8 9 731486787
9 10 923017604
10 11 520020314
11 12 598450495
12 13 772432347
13 14 65082675
14 15 905376194
15 16 112445962
16 17 449717550
17 18 624966046
18 19 300208577
19 20 198329359
20...

output:

28
7
20
155
51
24492
23685
30
133
14700
204
50775
50177
114
532
83
2884
27
20855
23
117
194
139
67820
36
31788
27
100000
142
186
4
10014
6
7942
1
100000
132
73715
10
74
160
66725
11
100000
100000
22
57463
15280
303
35136
51
65
556
113
34054
24
851
20527
1101
54
45368
3
42
702
11
35
3762
3
93588
8
58...

result:

ok 15102 numbers

Test #12:

score: 0
Accepted
time: 501ms
memory: 29580kb

input:

100000 30000
1 2 793126017
2 3 232330993
3 4 449065337
4 5 490733472
5 6 111589134
6 7 668100127
7 8 821095971
8 9 285891331
9 10 902446109
10 11 449050951
11 12 520804843
12 13 640551484
13 14 545522531
14 15 371179414
15 16 413586021
16 17 396937695
17 18 796739570
18 19 326494170
19 20 769171110
...

output:

54598
7234
2670
42497
20235
1707
178
12828
7636
8991
100000
6821
11643
35392
52297
39388
5538
30741
524
83977
1168
58757
8619
10299
4380
7501
13833
35865
193
19087
3646
38201
123
369
100000
12576
2484
23287
95
14638
2205
19
8385
5045
11518
27273
96810
39236
31815
48670
3476
10351
23503
100000
1234
1...

result:

ok 14953 numbers

Test #13:

score: 0
Accepted
time: 551ms
memory: 29700kb

input:

100000 30000
1 2 914076278
2 3 849075708
3 4 838143543
4 5 395635779
5 6 178103168
6 7 238090750
7 8 485456169
8 9 96798738
9 10 953953655
10 11 753633712
11 12 310722446
12 13 434513796
13 14 146296271
14 15 7536252
15 16 234163959
16 17 265914804
17 18 819483810
18 19 31553002
19 20 659460957
20 2...

output:

29412
26523
56269
58437
2301
695
2265
5556
13671
5033
74
1205
2475
11967
10762
62
413
1799
47885
466
167
102
8973
83448
7401
1503
3632
199
46638
56906
27
27503
11561
25788
27150
18473
6389
3730
20391
1750
41898
2025
23885
52
2273
22550
483
31639
15507
34642
26231
11512
53564
17996
2041
14127
8179
14...

result:

ok 27055 numbers

Test #14:

score: 0
Accepted
time: 6011ms
memory: 64152kb

input:

200000 200000
1 2 462099758
1 3 866972101
2 4 996540461
2 5 578524349
3 6 571095940
3 7 703136877
4 8 666580508
4 9 285459002
5 10 814201161
5 11 660727584
6 12 654376807
6 13 837770648
7 14 714870560
7 15 104972922
8 16 32803231
8 17 735694895
9 18 110658827
9 19 889606190
10 20 17130278
10 21 4067...

output:

200000
67686
200000
200000
200000
200000
200000
630
1
200000
200000
1
31346
1
200000
200000
561
5
1
200000
200000
200000
200000
26451
200000
200000
4
200000
200000
16916
200000
200000
153875
200000
200000
200000
200000
269
25
200000
200000
200000
200000
1
5742
200000
200000
200000
113574
200000
2942...

result:

ok 100022 numbers

Test #15:

score: 0
Accepted
time: 3537ms
memory: 62644kb

input:

200000 200000
1 2 267010287
2 3 167068641
3 4 926147815
4 5 278208820
5 6 739843382
6 7 662489052
7 8 868323923
8 9 370708651
9 10 197960447
10 11 453593839
11 12 593358148
12 13 867598178
13 14 321466717
14 15 531052203
15 16 684794512
16 17 86921369
17 18 272875802
18 19 77083057
19 20 244571756
2...

output:

468
89
102
5
41
491
207
198
288
307
197
143
57
275
168
5
34
150
151
87
221
634
7
69
181
80
17
49
41
49
60
1323
1815
1179
981
28
922
234
38
124
25
459
406
1122
37
239
375
645
144
28
367
69
1168
413
33
43
305
422
26
30
2
668
2436
45
31
810
17
113
267
1
467
208
38
68
22
284
132
286
7
22
9
7
346
249
1
9...

result:

ok 99810 numbers

Test #16:

score: 0
Accepted
time: 6084ms
memory: 61592kb

input:

200000 200000
1 2 530262027
1 3 577167565
1 4 991638279
1 5 867902762
1 6 49113833
1 7 636751479
1 8 757930507
1 9 457909927
1 10 811776506
1 11 92479382
1 12 668573430
1 13 368351521
1 14 482946458
1 15 716207055
1 16 734689871
1 17 469203061
1 18 436245204
1 19 936484001
1 20 650565287
1 21 981462...

output:

543
17908
18325
96565
6039
60319
9138
32634
38869
163527
5272
67242
16885
41840
19723
40571
12028
8596
9708
671
165873
38146
17699
22998
242
24416
18562
5659
34
1
2340
91317
16323
17238
4040
98902
6897
13092
38011
12305
31218
105668
1
368
1881
11920
24287
37200
28287
18319
14607
15748
39054
49303
13...

result:

ok 99822 numbers

Test #17:

score: 0
Accepted
time: 6339ms
memory: 62288kb

input:

200000 200000
1 2 747157235
1 3 495557667
1 4 557250681
1 5 373058000
1 6 330210729
1 7 842153828
1 8 834790086
1 9 82820423
1 10 234384256
1 11 169048934
1 12 554053879
1 13 656281805
1 14 245175239
1 15 15339182
1 16 130032764
1 17 634709406
1 18 507167281
1 19 522574826
1 20 757475198
1 21 875842...

output:

19849
96
49
1
47
779
74734
110653
87
147530
12843
3
8
32643
76190
78606
27368
8535
56
3733
2420
2
42669
2746
200000
21675
18
5584
1708
2254
27
1
70122
406
203
81795
17262
61177
204
107338
80699
4146
2230
8855
3109
104314
3992
1424
399
14894
28
7
200000
39416
43093
11
20664
32
6760
57702
71
2851
82
8...

result:

ok 99760 numbers