#include #include #include #include using namespace std; struct vert{ int old, nw; }; const int MAXN = ( 1 << 18 ); int N; vector < int > v[MAXN]; int level[MAXN]; int rt, oldToNewName[MAXN], newToOldName[MAXN]; int it[MAXN], CURR = 0, out[MAXN]; int answer[MAXN * 3]; int C[MAXN*3], A[MAXN*3], B[MAXN*3]; vector < pair < int, int > > add[MAXN]; vector < pair < int, int > > del[MAXN]; void scan(){ scanf ( "%d", &N ); for ( int i = 1; i <= N; ++i ){ int x; scanf ( "%d", &x ); if ( x != -1 ) v[x].push_back ( i ); else rt = i; } } void dfs ( int i, int lvl ){ oldToNewName[i] = ++CURR; newToOldName[CURR] = i; level[i] = lvl; for ( int j = 0; j < v[i].size(); ++j ) dfs ( v[i][j], lvl + 1 ); out[i] = CURR; } void update ( int idx, int x ){ for ( ; idx < MAXN; idx += ( idx & ( -idx ) ) ) it[idx] += x; } int find ( int idx ){ int res = 0; for ( ;idx > 0; idx -= ( idx & -idx ) ) res += it[idx]; return res; } void solve(){ dfs ( rt, 1 ); int Q; scanf ( "%d", &Q ); for ( int i = 0; i < Q; ++i ){ scanf ( "%d%d%d", C + i, A + i, B + i ); if ( A[i] < 1 && B[i] < 1 ){ A[i] = max ( A[i], -level[ C[i] ] + 1 ); if ( A[i] > B[i] ) continue; answer[i] = ( answer[i] + B[i] - A[i] + 1 ); continue; } else if ( A[i] < 1 ){ A[i] = max ( A[i], -level[ C[i] ] + 1 ); answer[i] += ( -A[i] + 1 ); A[i] = 1; } A[i] += level[ C[i] ]; B[i] += level[ C[i] ]; if ( A[i] < 1 ) A[i] = 1; if ( B[i] > N + 1 ) B[i] = N + 1; add[out[ C[i] ]].push_back ( make_pair ( i, B[i] ) ); add[oldToNewName[ C[i] ] - 1].push_back ( make_pair ( i, A[i] - 1) ); /* cout << "ADD:\n"; cout << out[ C[i] ] << " " <