如果你使用线段树合并,并成功被 HACK
最后一个 HACK 点死活过不去,连 debug 都 debug 不了,最后使用强大的 devc++ 开大了栈空间才 debug 出来。这题给我卡傻了。
请开大栈空间至 128MiB,以便您更好地 debug。
顺便贴一下我的 CODE:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 1e6 + 5;
int read() {
int res = 0, flag = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') flag = -1; c = getchar(); }
while(c >= '0' && c <= '9') { res = res*10 + c-'0'; c = getchar(); }
return res*flag;
}
void print(int x) {
if(x>9) print(x/10);
putchar(x%10 + '0');
}
int n, q, cnt, top;
int ans[maxn], dep[maxn], root[maxn], st[22][maxn];
struct edge {
int to, nxt;
} e[maxn];
int tot = 1, head[maxn];
void addedge(int u, int v) {
e[++tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
}
struct node {
int p, id;
};
vector<node> ask[maxn];
void prework(int u) {
dep[u] = dep[st[0][u]] + 1;
for(int i = 1; (1<<i) < dep[u]; i++)
st[i][u] = st[i-1][st[i-1][u]];
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
prework(v);
}
}
#define mid ((l + r) >> 1)
int sum[maxn<<3], ls[maxn<<3], rs[maxn<<3], stk[maxn<<4];
int newnode() {
if(top) {
int x = stk[top];
top--;
return x;
}
else return ++cnt;
}
void del(int o) {
ls[o] = rs[o] = sum[o] = 0;
stk[++top] = o;
}
void build(int& o, int l, int r, int pos) {
if(!o) o = newnode();
if(l == r) { sum[o] = 1; return; }
if(pos <= mid) build(ls[o], l, mid, pos);
else build(rs[o], mid+1, r, pos);
sum[o] = sum[ls[o]] + sum[rs[o]];
}
void merge(int& o, int p, int l, int r) {
if(!o || !p) { o += p; return; }
if(l == r) { sum[o] += sum[p]; del(p); return; }
merge(ls[o], ls[p], l, mid);
merge(rs[o], rs[p], mid+1, r);
sum[o] = sum[ls[o]] + sum[rs[o]];
del(p);
}
int query(int o, int l, int r, int pos) {
if(l == r) return sum[o];
if(pos <= mid) return query(ls[o], l, mid, pos);
else return query(rs[o], mid+1, r, pos);
}
void dfs(int u) {
build(root[u], 1, n, dep[u]);
for(int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
dfs(v);
merge(root[u], root[v], 1, n);
}
for(int i = 0; i < ask[u].size(); i++) {
int p = ask[u][i].p, id = ask[u][i].id;
ans[id] = query(root[u], 1, n, p) - 1;
}
}
int main() {
freopen("in.txt", "r", stdin);
n = read(), q = read();
for(int i = 2; i <= n; i++) {
st[0][i] = read();
addedge(st[0][i], i);
}
prework(1);
for(int i = 1; i <= q; i++) {
int u, v, k;
u = read(), k = read();
v = u;
for(int p = 20; p >= 0; p--)
if((k>>p) & 1) v = st[p][v];
if(v) ask[v].push_back((node){dep[u], i});
}
dfs(1);
for(int i = 1; i <= q; i++)
print(ans[i]), putchar(' ');
return 0;
}