最后一个点WA了
提示是too short on line 1
#include <bits/stdc++.h>
using namespace std;
inline int inti() {
char c;
bool f(true);
while (!isdigit(c = getchar())) f = c != '-';
int x(c ^ 48);
while (isdigit(c = getchar())) x = x * 10 + (c ^ 48);
return f ? x : -x;
}
const int N(2e5 + 5);
int n, m, head[N + 5], tot(1), mappe[N + 5], mappv[N + 5], val[N + 5];
int dfn[N + 5], son[N + 5], fa[N + 5], sz[N + 5], dep[N + 5], top[N + 5], cntD;
struct Edge {
int to, nxt;
}e[N * 2 + 5];
void add(int u, int v) {e[++tot] = (Edge) {v, head[u]}, head[u] = tot;}
void dfs1(int u) {
sz[u] = 1;
for (int i(head[u]); i; i = e[i].nxt) {
int v(e[i].to);
if (v == fa[u])
continue;
fa[v] = u, dep[v] = dep[u] + 1, mappe[v] = i >> 1, mappv[i >> 1] = v;
dfs1(v), sz[u] += sz[v];
if (sz[son[u]] < sz[v])
son[u] = v;
}
}
void dfs2(int u, int tp) {
top[u] = tp, dfn[u] = ++cntD;
if (son[u])
dfs2(son[u], tp);
for (int i(head[u]); i; i = e[i].nxt)
if (e[i].to != fa[u] && e[i].to != son[u])
dfs2(e[i].to, e[i].to);
}
int sum[N * 4 + 5], maxx[N * 4 + 5], minn[N * 4 + 5];
bool tag[N * 4 + 5];
void update(int rt) {
tag[rt] ^= 1, sum[rt] = -sum[rt];
swap(maxx[rt], minn[rt]);
maxx[rt] = -maxx[rt], minn[rt] = -minn[rt];
}
void pushup(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
maxx[rt] = max(maxx[rt << 1], maxx[rt << 1 | 1]);
minn[rt] = min(minn[rt << 1], minn[rt << 1 | 1]);
}
void pushdown(int rt) {
if (!tag[rt])
return;
update(rt << 1);
update(rt << 1 | 1);
tag[rt] = false;
}
void modify2(int rt, int L, int R, int l, int r) {
if (l <= L && R <= r) {
update(rt);
return;
}
int mid(L + R >> 1);
pushdown(rt);
if (l <= mid)
modify2(rt << 1, L, mid, l, r);
if (r > mid)
modify2(rt << 1 | 1, mid + 1, R, l, r);
pushup(rt);
}
void modify1(int rt, int L, int R, int p, int k) {
if (L == R) {
sum[rt] = maxx[rt] = minn[rt] = k;
return;
}
int mid(L + R >> 1);
pushdown(rt);
if (p <= mid)
modify1(rt << 1, L, mid, p, k);
else
modify1(rt << 1 | 1, mid + 1, R, p, k);
pushup(rt);
}
int query_max(int rt, int L, int R, int l, int r) {
if (l <= L && R <= r)
return maxx[rt];
int mid(L + R >> 1), ans(-0x7fffffff);
pushdown(rt);
if (l <= mid)
ans = max(ans, query_max(rt << 1, L, mid, l, r));
if (r > mid)
ans = max(ans, query_max(rt << 1 | 1, mid + 1, R, l, r));
return ans;
}
int query_min(int rt, int L, int R, int l, int r) {
if (l <= L && R <= r)
return minn[rt];
int mid(L + R >> 1), ans(0x7fffffff);
pushdown(rt);
if (l <= mid)
ans = min(ans, query_min(rt << 1, L, mid, l, r));
if (r > mid)
ans = min(ans, query_min(rt << 1 | 1, mid + 1, R, l, r));
return ans;
}
int query_sum(int rt, int L, int R, int l, int r) {
if (l <= L && R <= r)
return sum[rt];
int mid(L + R >> 1), ans(0);
pushdown(rt);
if (l <= mid)
ans += query_sum(rt << 1, L, mid, l, r);
if (r > mid)
ans += query_sum(rt << 1 | 1, mid + 1, R, l, r);
return ans;
}
void test1(int w, int i) {modify1(1, 1, n, dfn[mappv[i]], w);}
void test2(int v, int u) {
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]])
swap(u, v);
modify2(1, 1, n, dfn[top[u]], dfn[u]);
u = fa[top[u]];
}
if (dep[u] < dep[v])
modify2(1, 1, n, dfn[son[u]], dfn[v]);
if (dep[v] < dep[u])
modify2(1, 1, n, dfn[son[v]], dfn[u]);
}
void test3(int v, int u) {
int ans(0);
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]])
swap(u, v);
ans += query_sum(1, 1, n, dfn[top[u]], dfn[u]);
u = fa[top[u]];
}
if (dep[u] < dep[v])
ans += query_sum(1, 1, n, dfn[son[u]], dfn[v]);
if (dep[v] < dep[u])
ans += query_sum(1, 1, n, dfn[son[v]], dfn[u]);
printf("%d\n", ans);
}
void test4(int v, int u) {
int ans(-0x7fffffff);
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]])
swap(u, v);
ans = max(ans, query_max(1, 1, n, dfn[top[u]], dfn[u]));
u = fa[top[u]];
}
if (dep[u] < dep[v])
ans = max(ans, query_max(1, 1, n, dfn[son[u]], dfn[v]));
if (dep[v] < dep[u])
ans = max(ans, query_max(1, 1, n, dfn[son[v]], dfn[u]));
printf("%d\n", ans);
}
void test5(int v, int u) {
int ans(0x7fffffff);
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]])
swap(u, v);
ans = min(ans, query_min(1, 1, n, dfn[top[u]], dfn[u]));
u = fa[top[u]];
}
if (dep[u] < dep[v])
ans = min(ans, query_min(1, 1, n, dfn[son[u]], dfn[v]));
if (dep[v] < dep[u])
ans = min(ans, query_min(1, 1, n, dfn[son[v]], dfn[u]));
printf("%d\n", ans);
}
int main() {
n = inti();
for (int i(1); i < n; ++i) {
int u(inti() + 1), v(inti() + 1);
add(u, v), add(v, u), val[i] = inti();
}
dfs1(1), dfs2(1, 1);;
for (int i(2); i <= n; ++i) modify1(1, 1, n, dfn[i], val[mappe[i]]);
for (m = inti(); m--; ) {
char opt[100];
scanf("%s", opt);
if (opt[0] == 'C')
test1(inti(), inti());
else if (opt[0] == 'N')
test2(inti() + 1, inti() + 1);
else if (opt[0] == 'S')
test3(inti() + 1, inti() + 1);
else if (opt[1] == 'A')
test4(inti() + 1, inti() + 1);
else
test5(inti() + 1, inti() + 1);
}
return 0;
}