我目前的级别大概只需要这些:
ll q_pow(ll a, ll b, ll p) {
ll ret = 1;
for (; b; a = a * a % p, b >>= 1) if (b & 1) ret = ret * a % p;
return ret;
}
ll inv(ll x, ll p) { return q_pow(x, p - 2, p); }
int tree[MAXN];
inline int lowbit(int x) { return x & -x; }
void insert(int pos, int k) { for (; pos <= N; pos += lowbit(pos)) tree[pos] += k; }
int query(int pos) { int ret = 0; for (; pos; pos -= lowbit(pos)) ret += tree[pos]; return ret; }
#define mid ((l + r) >> 1)
#define ZERO 0 //这可能要改
struct data {
ll x;
friend data operator+ (const data& l, const data& r) { return data{l.x + r.x}; } //这可能要改
} T[MAXN << 2];
ll tag[MAXN << 2]; // 我好像真没见过 tag 不止一个数的。。
data arr[MAXN];
void cover(int o, int l, int r, ll k) { T[o].x += k * (r - l + 1), tag[o] += k; } //这可能要改
void pushDown(int o, int l, int r) {
if (tag[o] != ZERO) cover(o << 1, l, mid, tag[o]), cover(o << 1 | 1, mid + 1, r, tag[o]), tag[o] = ZERO;
}
void build(int o, int l, int r) {
if (l == r) T[o] = arr[l];
else build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r), T[o] = T[o << 1] + T[o << 1 | 1];
}
void insert(int o, int l, int r, int L, int R, ll K) {
if (l == L && r == R) cover(o, l, r, K);
else {
pushDown(o, l, r);
if (R <= mid) insert(o << 1, l, mid, L, R, K);
else if (L > mid) insert(o << 1 | 1, mid + 1, r, L, R, K);
else insert(o << 1, l, mid, L, mid, K), insert(o << 1 | 1, mid + 1, r, mid + 1, R, K);
T[o] = T[o << 1] + T[o << 1 | 1];
}
}
data query(int o, int l, int r, int L, int R) {
if (l == L && r == R) return T[o];
else {
pushDown(o, l, r);
if (R <= mid) return query(o << 1, l, mid, L, R);
else if (L > mid) return query(o << 1 | 1, mid + 1, r, L, R);
else return query(o << 1, l, mid, L, mid) + query(o << 1 | 1, mid + 1, r, mid + 1, R);
}
}
#undef mid
#undef ZERO
int fa[MAXN][21], dep[MAXN];
void dfs(int u, int ff) {
fa[u][0] = ff, dep[u] = dep[ff] + 1;
for (int i = 1; i <= 20; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1];
for (int i = head[u]; i; i = E[i].next) if (E[i].v != ff) dfs(E[i].v, u);
}
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
for (int i = 20; i >= 0; --i) if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
if (u == v) return u;
for (int i = 20; i >= 0; --i) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
return fa[u][0];
}
int fa[MAXN], dep[MAXN], siz[MAXN], wson[MAXN], tpo[MAXN], dfn[MAXN], dfncnt;
void dfs1(int u, int ff) {
fa[u] = ff, dep[u] = dep[ff] + 1, siz[u] = 1;
for (int i = head[u]; i; i = E[i].next) {
if (E[i].v == ff) continue; dfs1(E[i].v, u), siz[u] += siz[E[i].v];
if (siz[E[i].v] > siz[wson[u]]) wson[u] = E[i].v;
}
}
void dfs2(int u, int ff, int tp) {
top[u] = tp, dfn[u] = ++dfncnt;
if (wson[u]) dfs2(wson[u], u, tp);
for (int i = head[u]; i; i = E[i].next) if (E[i].v != ff && E[i].v != wson[u]) dfs2(E[i].v, u, E[i].v);
}