非常难绷boss打的我原地升天,8pts on#11。 警示后人翻了一万年了属于是。 见者玄关
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
const int N = 2e5+5;
inline int read() {
int x=0,f=1;char C=getchar();
while(C<'0'||C>'9'){if(C=='-') f=-1;C=getchar();}
while(C>='0'&&C<='9') x=(x<<3)+(x<<1)+(C^48),C=getchar();
return x*f;
}
inline char get() {
char C=getchar();
while ((C<'a'||C>'z')&&(C<'A'||C>'Z')) C=getchar();
return C;
}
inline void write(int x){
if(x<0){putchar('-'); x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
int n, q, u, v, w, x, y;
char op;
pii E[N];
vector<pii> e[N];
int de[N], sz[N], dfn[N], f[N], a[N], t[N], top[N], cnt;
void dfs1(int u, int fa)
{
de[u] = de[fa]+1;
sz[u] = 1;
f[u] = fa;
for (auto v : e[u])
{
if (v.first == fa) continue;
t[v.first] = v.second;
dfs1(v.first, u);
sz[u] += sz[v.first];
}
}
void dfs2(int u, int fir)
{
dfn[u] = ++cnt;
a[cnt] = t[u];
top[u] = fir;
int hson = 0;
for (auto v : e[u])
{
if (v.first != f[u] && sz[v.first] > sz[hson])
hson = v.first;
}
if (!hson) return;
dfs2(hson, fir);
for (auto v : e[u])
{
if (v.first != f[u] && v.first != hson)
dfs2(v.first, v.first);
}
}
int sum[N<<2], maxx[N<<2], minn[N<<2];
bool tag[N<<2];
void push_down(int rt)
{
if (tag[rt])
{
sum[rt<<1] = -sum[rt<<1];
maxx[rt<<1] = -maxx[rt<<1];
minn[rt<<1] = -minn[rt<<1];
swap(maxx[rt<<1], minn[rt<<1]);
sum[rt<<1|1] = -sum[rt<<1|1];
maxx[rt<<1|1] = -maxx[rt<<1|1];
minn[rt<<1|1] = -minn[rt<<1|1];
swap(maxx[rt<<1|1], minn[rt<<1|1]);
tag[rt<<1] ^= 1;
tag[rt<<1|1] ^= 1;
tag[rt] = 0;
}
}
void push_up(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 build(int rt, int l, int r)
{
if (l == r)
{
sum[rt] = maxx[rt] = minn[rt] = a[l];
return;
}
int mid = (l+r)>>1;
build(rt<<1, l, mid);
build(rt<<1|1, mid+1, r);
push_up(rt);
}
void re(int rt, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
sum[rt] = -sum[rt];
maxx[rt] = -maxx[rt];
minn[rt] = -minn[rt];
swap(maxx[rt], minn[rt]);
tag[rt] ^= 1;
return;
}
push_down(rt);
int mid = (l+r)>>1;
if (ql <= mid)
re(rt<<1, l, mid, ql, qr);
if (qr >= mid+1)
re(rt<<1|1, mid+1, r, ql, qr);
push_up(rt);
}
void update(int rt, int l, int r, int pos)
{
if (l == r)
{
sum[rt] = maxx[rt] = minn[rt] = a[l];
return;
}
push_down(rt);
int mid = (l+r)>>1;
if (pos <= mid)
update(rt<<1, l, mid, pos);
else
update(rt<<1|1, mid+1, r, pos);
push_up(rt);
}
int qsum(int rt, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
return sum[rt];
}
push_down(rt);
int mid = (l+r)>>1;
int res = 0;
if (ql <= mid)
res += qsum(rt<<1, l, mid, ql, qr);
if (qr >= mid+1)
res += qsum(rt<<1|1, mid+1, r, ql, qr);
return res;
}
int qmax(int rt, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
return maxx[rt];
}
push_down(rt);
int mid = (l+r)>>1;
int res = -1e9;
if (ql <= mid)
res = max(res, qmax(rt<<1, l, mid, ql, qr));
if (qr >= mid+1)
res = max(res, qmax(rt<<1|1, mid+1, r, ql, qr));
return res;
}
int qmin(int rt, int l, int r, int ql, int qr)
{
if (ql <= l && r <= qr)
{
return minn[rt];
}
push_down(rt);
int mid = (l+r)>>1;
int res = 1e9;
if (ql <= mid)
res = min(res, qmin(rt<<1, l, mid, ql, qr));
if (qr >= mid+1)
res = min(res, qmin(rt<<1|1, mid+1, r, ql, qr));
return res;
}
vector<pii> p;
void path(int x, int y)
{
p.clear();
while (top[x] != top[y])
{
if (de[top[x]] < de[top[y]]) swap(x, y);
p.push_back({dfn[top[x]], dfn[x]});
x = f[top[x]];
}
if (de[top[x]] > de[top[y]]) swap(x, y);
if (x != y)
p.push_back({dfn[x]+1, dfn[y]});
}
signed main()
{
//freopen("P1505_1.in", "r", stdin);
n = read();
for (int i = 1; i < n; i++)
{
u = read()+1;
v = read()+1;
w = read();
e[u].push_back({v, w});
e[v].push_back({u, w});
E[i] = {u, v};
}
dfs1(1, 0);
dfs2(1, 1);
build(1, 1, n);
q = read();
while (q--)
{
op = get();
if (op == 'C')
{
x = read();
y = read();
if (de[E[x].first] > de[E[x].second]) v = E[x].first;
else v = E[x].second;
t[v] = y;
a[dfn[v]] = y;
update(1, 1, n, dfn[v]);
}
else if (op == 'N')
{
x = read()+1;
y = read()+1;
path(x, y);
for (auto i : p)
re(1, 1, n, i.first, i.second);
}
else
{
op = get();
x = read()+1;
y = read()+1;
path(x, y);
int res;
if (op == 'U')
{
res = 0;
for (auto i : p)
res += qsum(1, 1, n, i.first, i.second);
}
else if (op == 'A')
{
res = -1e9;
for (auto i : p)
res = max(res, qmax(1, 1, n, i.first, i.second));
}
else
{
res = 1e9;
for (auto i : p)
res = min(res, qmin(1, 1, n, i.first, i.second));
}
write(res);
putchar('\n');
}
}
return 0;
}