#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mpair make_pair #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef long double ld; const ld epsylon = 1e-9; struct dat { int from, to; int idx; int qidx; }; int get(const vector& sums, int from, int to, int level) { int res = 0; if ( from > to ) { return 0; } if (to < 0) { if (-to > level) { return 0; } return min(-from, level) - (-to) + 1; } if (to >= sums.size()) { to = (int)sums.size() - 1; } if ( from >= (int)sums.size()) { return 0; } if (from < 0 ) { if ( -from >= level) { res += level; } else { res += -from; } from = 0; } if (to == (int)sums.size() - 1) { return res + sums[from]; } else { return res + sums[from] - sums[to + 1]; } } int main() { freopen("tree.in","r",stdin); freopen("tree.out", "w", stdout); int n; cin >> n; vector dad(n); vector > sons(n); int root; for ( int i=0;i level(n, -1); queue q; vector > nodes(n); nodes[0].push_back(root); q.push(root); level[root] = 0; int maxl = 0; while(!q.empty()) { int c = q.front();q.pop(); for (int i=0;i> Q; vector > a(maxl + 1); vector ans(Q); for (int i =0 ;i >* pr = NULL; vector rev(n); for (int i = maxl; i >= 0; --i) { vector >* temp = new vector >(nodes[i].size(), vector(1,1)); for (int j=0;j 1) { (*temp)[j][0] += (*temp)[j][1]; } } for (int j = 0 ;j < a[i].size(); ++j) { const dat& cur = a[i][j]; int idx = rev[cur.idx]; int res = get((*temp)[idx], cur.from, cur.to, level[cur.idx]); ans[cur.qidx] = res; } if ( pr != 0) { delete pr; } pr = temp; } for ( int i = 0 ;i< ans.size(); ++i ) { printf("%d\n", ans[i]); } return 0; }