样例过了,但全RE
查看原帖
样例过了,但全RE
307211
ChickyHas楼主2023/7/11 16:01
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 1e5 + 1;

struct T {
  int v, l, r;
} t[N * 100];

int n, m, k, u, v, f[N][25], d[N], ans, a[N], b[N], rt[N], nc, q;
vector<int> e[N];

void Build(int &i, int l, int r) {
  i = ++nc;
  if (l != r) {
    int m = l + r >> 1;
    Build(t[i].l, l, m);
    Build(t[i].r, m + 1, r);
  }
}

void Modify(int i, int &_i, int l, int r, int p) {
  _i = ++nc;
  t[_i] = t[i], t[_i].v++;
  if (l == r) {
    return;
  }
  int m = l + r >> 1;
  p <= m ? Modify(t[i].l, t[_i].l, l, m, p) : Modify(t[i].r, t[_i].r, m + 1, r, p);
}

void Dfs(int x, int fa) {
  Modify(rt[fa], rt[x], 1, q, lower_bound(b + 1, b + q + 1, a[x]) - b);
  f[x][0] = fa, d[x] = d[fa] + 1;
  for (int i = 1; i <= 20; ++i) {
    f[x][i] = f[f[x][i - 1]][i - 1];
  }
  for (int i : e[x]) {
    if (i != fa) {
      Dfs(i, x);
    }
  }
}

int Lca(int u, int v) {
  if (d[u] < d[v]) {
    swap(u, v);
  }
  for (int i = 20; i >= 0; --i) {
    if (d[f[u][i]] >= d[v]) {
      u = f[u][i];
    }
  }
  if (u == v) {
    return u;
  }
  for (int i = 20; i >= 0; --i) {
    if (f[u][i] != f[v][i]) {
      u = f[u][i], v = f[v][i];
    }
  }
  return f[u][0];
}

int Query(int x, int y, int z, int w, int l, int r, int k) {
  if (l == r) {
    return l;
  }
  int s = t[t[x].l].v + t[t[y].l].v - t[t[z].l].v - t[t[w].l].v, m = l + r >> 1;
  return k <= s ? Query(t[x].l, t[y].l, t[z].l, t[w].l, l, m, k) : Query(t[x].r, t[y].r, t[z].r, t[w].r, m + 1, r, k - s);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    b[i] = a[i];
  }
  for (int i = 1; i < n; ++i) {
    cin >> u >> v;
    e[u].emplace_back(v), e[v].emplace_back(u);
  }
  sort(b + 1, b + n + 1);
  q = unique(b + 1, b + n + 1) - b - 1;
  Build(rt[0], 1, q);
  Dfs(1, 0);
  for (int i = 1; i <= m; ++i) {
    cin >> u >> v >> k;
    int lca = Lca(u, v);
    cout << (ans = b[Query(rt[u ^ ans], rt[v], rt[lca], rt[f[lca][0]], 1, q, k)]) << '\n';
  }
  return 0;
}
2023/7/11 16:01
加载中...