rt,请问是哪里写挂了?
#include <bits/stdc++.h>
using namespace std;
#define inf 2147483647
#define V 1000010
#define E 5000010
typedef long long int ll;
struct edge { int to, next; ll w; };
int cnt = 0, head[V], son[V], fa[V], siz[V], dep[V], top[V], dfn[V], id[V], bh[V], ne[V], dct = 0, n, m, r; edge node[E]; ll w[V];
inline void add(int fir, int nxt, ll w) {
node[cnt].to = nxt,
node[cnt].next = head[fir],
node[cnt].w = w;
head[fir] = cnt++;
}
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
struct segtree {
public:
struct ment {
public:
int l, r;
ll sum, max, min;
bool tage;
ment() { tage = l = r = sum = 0; max = -inf, min = inf; }
};
vector<ment>tree;
ll build(int l, int r, int i = 1);
ll querysum(int l, int r, int i = 1);
ll querymax(int l, int r, int i = 1);
ll querymin(int l, int r, int i = 1);
void modfiy(int l, int r, int i = 1);
void updata(int n, ll k, int i = 1);
void pushdown(int i);
void pushup(int i);
}stree;
ll segtree::build(int l, int r, int i) {
tree[i].l = l, tree[i].r = r;
if (l == r) {
tree[i].max = tree[i].min = tree[i].sum = w[id[l]];
return tree[i].sum;
}
int mid = (l + r) >> 1;
tree[i].sum = build(l, mid, i << 1) + build(mid + 1, r, (i << 1) | 1);
tree[i].max = max(tree[ls(i)].max, tree[rs(i)].max);
tree[i].min = min(tree[ls(i)].min, tree[rs(i)].min);
return tree[i].sum;
}
inline void segtree::pushdown(int i) {
if (tree[i].tage) {
tree[ls(i)].tage ^= 1, tree[rs(i)].tage ^= 1;
ll ls1 = tree[ls(i)].max, ls2 = tree[rs(i)].max;
tree[ls(i)].sum = -tree[ls(i)].sum, tree[rs(i)].sum = -tree[rs(i)].sum;
swap(tree[ls(i)].max, tree[ls(i)].min); swap(tree[rs(i)].max, tree[rs(i)].min);
tree[ls(i)].min *= -1; tree[ls(i)].max *= -1; tree[rs(i)].min *= -1; tree[rs(i)].max *= -1;
tree[i].tage = 0;
pushup(i);
}
}
inline void segtree::pushup(int i) {
tree[i].sum = tree[ls(i)].sum + tree[rs(i)].sum;
tree[i].max = max(tree[ls(i)].max, tree[rs(i)].max);
tree[i].max = min(tree[ls(i)].min, tree[rs(i)].min);
}
ll segtree::querysum(int l, int r, int i) {
ll sum = 0;
if (tree[i].l >= l && tree[i].r <= r)return tree[i].sum; pushdown(i);
if (tree[i << 1].r >= l)sum += querysum(l, r, i << 1);
if (tree[(i << 1) | 1].l <= r)sum += querysum(l, r, (i << 1) | 1);
return sum;
}
ll segtree::querymax(int l, int r, int i) {
ll sum = -inf;
if (tree[i].l >= l && tree[i].r <= r)return tree[i].max; pushdown(i);
if (tree[i << 1].r >= l)sum = max(sum, querymax(l, r, i << 1));
if (tree[(i << 1) | 1].l <= r)sum = max(sum, querymax(l, r, (i << 1) | 1));
return sum;
}
ll segtree::querymin(int l, int r, int i) {
ll sum = inf;
if (tree[i].l >= l && tree[i].r <= r)return tree[i].min; pushdown(i);
if (tree[i << 1].r >= l)sum = min(sum, querymin(l, r, i << 1));
if (tree[(i << 1) | 1].l <= r)sum = min(sum, querymin(l, r, (i << 1) | 1));
return sum;
}
void segtree::modfiy(int l, int r, int i) {
if (tree[i].l >= l && tree[i].r <= r) {
tree[i].tage ^= 1;
tree[i].sum = -tree[i].sum;
swap(tree[i].max, tree[i].min);
tree[i].max *= -1; tree[i].min *= -1;
return;
}pushdown(i);
if (tree[i << 1].r >= l) modfiy(l, r, i << 1);
if (tree[(i << 1) | 1].l <= r) modfiy(l, r, (i << 1) | 1);
pushup(i);
}
void segtree::updata(int n, ll k, int i) {
if (tree[i].l == tree[i].r) {
tree[i].sum = tree[i].max = tree[i].min = k;
return;
}
pushdown(i);
if (tree[ls(i)].r >= n)updata(n, k, i << 1);
else if (tree[rs(i)].l <= n)updata(n, k, (i << 1) | 1);
pushup(i);
}
void dfs1(int v = r, int f = 0) {
fa[v] = f, siz[v] = 1, dep[v] = dep[f] + 1; int u, msiz = -1, mson = -1;
for (register int i = head[v]; i != -1; i = node[i].next) {
u = node[i].to;
if (u == fa[v])continue;
w[u] = node[i].w;
ne[bh[i]] = u;
dfs1(u, v);
if (siz[u] > msiz)msiz = siz[u], mson = u;
siz[v] += siz[u];
}
son[v] = mson;
}
void dfs2(int v = r, int t = r) {
dfn[v] = ++dct, top[v] = t, id[dfn[v]] = v;
if (son[v] == -1)return;
dfs2(son[v], t); int u;
for (register int i = head[v]; i != -1; i = node[i].next) {
u = node[i].to;
if (u == son[v] || u == fa[v])continue;
dfs2(u, u);
}
}
inline void init() {
dep[0] = 0, top[r] = r;
stree.tree.resize(n << 2);
}
inline void modpath(int x, int y) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])swap(x, y);
stree.modfiy(dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
if (dep[x] > dep[y])swap(x, y);
if (x == y)return;
stree.modfiy(dfn[x] + 1, dfn[y]);
}
inline ll quesum(int x, int y) {
ll sum = 0;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])swap(x, y);
sum += stree.querysum(dfn[top[x]], dfn[x]);
x = fa[top[x]];
}
if (dep[x] > dep[y])swap(x, y);
if (x == y)return sum;
return sum + stree.querysum(dfn[x] + 1, dfn[y]);
}
inline ll quemax(int x, int y) {
ll sum = -inf;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])swap(x, y);
sum = max(sum, stree.querymax(dfn[top[x]], dfn[x]));
x = fa[top[x]];
}
if (dep[x] > dep[y])swap(x, y);
if (x == y)return sum;
return max(sum, stree.querymax(dfn[x] + 1, dfn[y]));
}
inline ll quemin(int x, int y) {
ll sum = inf;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])swap(x, y);
sum = min(sum, stree.querymin(dfn[top[x]], dfn[x]));
x = fa[top[x]];
}
if (dep[x] > dep[y])swap(x, y);
if (x == y)return sum;
return min(sum, stree.querymin(dfn[x] + 1, dfn[y]));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(); cout.tie();
memset(head, -1, V * sizeof(int));
cin >> n; r = 1; int x, y; ll z; string q;
for (register int i = 1; i < n; i++) {
bh[i] = cnt; cin >> x >> y >> z;
add(x + 1, y + 1, z); add(y + 1, x + 1, z);
}
cin >> m;
init(), dfs1(), dfs2(), stree.build(1, n);
while (m--) {
cin >> q;
if (q == "C") { cin >> x >> y; stree.updata(dfn[ne[bh[x]]], y); }
else if (q == "N") { cin >> x >> y; modpath(x + 1, y + 1); }
else if (q == "SUM") { cin >> x >> y; cout << quesum(x + 1, y + 1) << endl; }
else if (q == "MAX") { cin >> x >> y; cout << quemax(x + 1, y + 1) << endl; }
else { cin >> x >> y; cout << quemin(x + 1, y + 1) << endl; }
}
return 0;
}