RT,LOJ 过了,但是洛谷在链中,n≤5×105 的数据挂得不成样子……
#include <bits/stdc++.h>
using namespace std;
const int N = 500010, LOGN = 25;
int n, q, ql[N], qr[N], qk[N], qp[N], qans[N], dep[N], lg2[N], fa[LOGN][N], a[N], sl[N << 1], sr[N << 1], sk[N << 1], sp[N << 1], cnt;
map <int, int> tmp;
set < pair <int, int> > s;
vector <int> ops[N], ins[N];
inline int read () {
int x = 0;
char ch = getchar_unlocked ();
while (ch < 48 || ch > 57) {
ch = getchar_unlocked ();
}
while (ch >= 48 && ch <= 57) {
x = (x << 3) + (x << 1) + (ch ^ '0');
ch = getchar_unlocked ();
}
return x;
}
namespace gf {
int h[N], c;
struct node {
int nxt, to;
} a[N << 1];
inline void add (int u, int v) {
a[++c].nxt = h[u];
a[c].to = v;
h[u] = c;
a[++c].nxt = h[v];
a[c].to = u;
h[v] = c;
}
}
inline void dfs (int u, int fat) {
for (int i = gf::h[u]; i != 0; i = gf::a[i].nxt) {
int v = gf::a[i].to;
if (v == fat) {
continue;
}
dep[v] = dep[u] + 1;
fa[0][v] = u;
dfs (v, u);
}
}
struct segtree {
int dat[N << 2];
inline void modify (int p, int l, int r, int qp, int qx) {
if (l == r) {
dat[p] = max (dat[p], qx);
return ;
}
int mid = (l + r) >> 1;
if (qp <= mid) {
modify (p << 1, l, mid, qp, qx);
} else {
modify (p << 1 | 1, mid + 1, r, qp, qx);
}
dat[p] = max (dat[p << 1], dat[p << 1 | 1]);
}
inline int query (int p, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
return dat[p];
}
int mid = (l + r) >> 1, ans = 0;
if (ql <= mid) {
ans = max (ans, query (p << 1, l, mid, ql, qr));
}
if (qr > mid) {
ans = max (ans, query (p << 1 | 1, mid + 1, r, ql, qr));
}
return ans;
}
} T[3];
int main () {
// freopen ("query.in", "r", stdin);
// freopen ("query.out", "w", stdout);
n = read ();
for (int i = 1; i < n; ++i) {
int u, v;
u = read (), v = read ();
gf::add (u, v);
}
q = read ();
for (int i = 1; i <= q; ++i) {
ql[i] = read (), qr[i] = read (), qk[i] = read ();
qp[i] = i;
}
dep[1] = 1;
dfs (1, -1);
ins[1].push_back (1);
for (int i = 2; i <= n; ++i) {
ins[dep[i]].push_back (i);
lg2[i] = lg2[i >> 1] + 1;
}
for (int p = 1; p <= lg2[n]; ++p) {
for (int i = 1; i <= n; ++i) {
fa[p][i] = fa[p - 1][fa[p - 1][i]];
}
}
for (int i = 1; i < n; ++i) {
int u = i, v = i + 1;
if (dep[u] < dep[v]) {
swap (u, v);
}
for (int p = lg2[n]; p >= 0; --p) {
if (dep[fa[p][u]] >= dep[v]) {
u = fa[p][u];
}
}
if (u == v) {
a[i] = dep[u];
} else {
for (int p = lg2[n]; p >= 0; --p) {
if (fa[p][u] != fa[p][v]) {
u = fa[p][u];
v = fa[p][v];
}
}
a[i] = dep[u] - 1;
}
ops[a[i]].push_back (i);
}
for (int i = n; i >= 1; --i) {
if (ins[i].empty ()) {
continue;
}
sort (ins[i].begin (), ins[i].end ());
sort (ops[i].begin (), ops[i].end ());
for (auto j : ins[i]) {
s.insert (make_pair (j, j));
tmp[j] = j;
}
for (auto j : ops[i]) {
auto t1 = s.lower_bound (make_pair (j + 1, 0));
auto t2 = t1--;
if (tmp.count (t2 -> first)) {
tmp.erase (t2 -> first);
}
pair <int, int> ret = make_pair (t1 -> first, t2 -> second);
tmp[t1 -> first] = t2 -> second;
s.erase (t1), s.erase (t2), s.insert (ret);
}
for (auto j : tmp) {
sl[++cnt] = j.first, sr[cnt] = j.second, sk[cnt] = i;
}
tmp.clear ();
}
for (int i = 1; i <= cnt; ++i) {
sp[i] = i;
}
sort (qp + 1, qp + q + 1, [] (int x, int y) { return qk[x] > qk[y]; });
sort (sp + 1, sp + cnt + 1, [] (int x, int y) { return sr[x] - sl[x] > sr[y] - sl[y]; });
for (int i = n, j1 = 1, j2 = 1; i >= 1; --i) {
for (; j1 <= cnt && sr[sp[j1]] - sl[sp[j1]] + 1 == i; j1++) {
T[0].modify (1, 1, n, sl[sp[j1]], sk[sp[j1]]);
T[1].modify (1, 1, n, sr[sp[j1]], sk[sp[j1]]);
}
for (; j2 <= q && qk[qp[j2]] == i; j2++) {
qans[qp[j2]] = max (qans[qp[j2]], T[0].query (1, 1, n, ql[qp[j2]], qr[qp[j2]] - i + 1));
qans[qp[j2]] = max (qans[qp[j2]], T[1].query (1, 1, n, ql[qp[j2]] + i - 1, qr[qp[j2]]));
}
}
sort (qp + 1, qp + q + 1, [] (int x, int y) { return qr[x] > qr[y]; });
sort (sp + 1, sp + cnt + 1, [] (int x, int y) { return sr[x] > sr[y]; });
for (int i = n, j1 = 1, j2 = 1; i >= 1; --i) {
for (; j1 <= cnt && sr[sp[j1]] == i; j1++) {
T[2].modify (1, 1, n, sl[sp[j1]], sk[sp[j1]]);
}
for (; j2 <= q && qr[qp[j2]] == i; j2++) {
qans[qp[j2]] = max (qans[qp[j2]], T[2].query (1, 1, n, 1, ql[qp[j2]]));
}
}
for (int i = 1; i <= q; ++i) {
printf ("%d\n", qans[i]);
}
return 0;
}