#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int N = 1e5 + 5;
struct matrix { int data[2][2]; matrix() { memset(data, -0x3f, sizeof(data)); }; matrix operator * (const matrix a) const { matrix c; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) c.data[i][j] = max(c.data[i][j], data[i][k] + a.data[k][j]); return c; } } it[N]; struct tree { int l, r; matrix mx; } tr[4 * N]; int n, m, a[N], fa[N], siz[N], son[N]; int head[N], ver[2 * N], net[2 * N], idx, ed[N]; int top[N], tot, id[N], f[N][2], dfsn[N];
void add(int a, int b) { net[++idx] = head[a], ver[idx] = b, head[a] = idx; }
void dfs1(int u, int f) { siz[u] = 1, fa[u] = f; for (int i = head[u]; i; i = net[i]) { int v = ver[i]; if (v == f) continue; dfs1(v, u); siz[u] += siz[v]; if (siz[v] > siz[son[u]]) son[u] = v; } }
void dfs2(int u, int t) { dfsn[u] = ++tot, id[tot] = u, top[u] = t; f[u][0] = 0, f[u][1] = a[u], ed[t] = max(ed[t], tot); it[u].data[0][0] = it[u].data[0][1] = 0; it[u].data[1][0] = a[u]; if (!son[u]) return; dfs2(son[u], t); f[u][0] += max(f[son[u]][0], f[son[u]][1]); f[u][1] += f[son[u]][0]; for (int i = head[u]; i; i = net[i]) { int v = ver[i]; if (v == fa[u] || v == son[u]) continue; dfs2(v, v); f[u][0] += max(f[v][0], f[v][1]); f[u][1] += f[v][0]; it[u].data[0][0] += max(f[v][0], f[v][1]); it[u].data[0][1] = it[u].data[0][0]; it[u].data[1][0] += f[v][0]; } }