Problem:
Max Score: 1450 Points

Problem Statement

There are N workers in Atcoder company. Each worker is numbered 0 through N - 1, and the boss for worker i is p_i like a tree structure and the salary is currently a_i. (p_i < i, especially p_0 = -1 because worker 0 is a president)

In atcoder, the boss of boss of boss of ... (repeated k times) worker i called "k-th upper boss", and "k-th lower subordinate" called for vice versa.

You have to process Q queries for Atcoder:

Query 1: You are given v_i, d_i, x_i. Increase the salary of worker v_i, and all j-th (1 ≤ j ≤ d_i) lower subordinates by x_i.

Query 2: You are given v_i, d_i. Calculate the sum of salary of worker v_i and all j-th (1 ≤ j ≤ d_i) lower subordinates.

Query 3: You are given pr_i, ar_i. Now Atcoder has a new worker c! (c is the current number of workers) The boss is pr_i, and the first salary is ar_i.

Process all queries!!!

Input Format

Let the i-th query query_i, the input format is following:

N Q
p_0 a_0
p_1 a_1
: :
p_{N - 1} a_{N - 1}
query_0
query_1
: :
query_{Q - 1}

THe format of query_i is one of the three format:

1 v_i d_i x_i

2 v_i d_i

3 pr_i ar_i

Output Format

Print the result in one line for each query 2.

Constraints

N ≤ 400000

Q ≤ 50000

p_i < i for all valid i.

In each question 1 or 2, worker v_i exists.

d_i ≤ 400000

0 ≤ a_i, x_i ≤ 1000

Scoring

Subtask 1 [170 points]

N, Q ≤ 5000

Subtask 2 [310 points]

p_i + 1 = i for all valid i.

Subtask 3 [380 points]

There are no query 3.

Subtask 4 [590 points]

There are no additional constraints.

Sample Input 1

6 7
-1 6
0 5
0 4
2 3
2 2
1 1
2 0 1
1 0 2 1
2 2 1
3 3 3
2 0 3
3 3 4
2 1 1

Sample Output 1

15
12
30
8

Sample Input 2

7 9
-1 1
0 5
0 7
0 8
1 3
4 1
5 1
2 1 1
2 1 2
1 1 2 3
1 4 1 1
2 3 1
2 0 2
3 6 1
3 7 11
2 0 15

Sample Output 2

8
9
8
31
49

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

int N, Q, A[500005];
long long fw[900005], fw2[900005];
vector<int> children[500005];

long long dfs(int x, int l, int a) {
	A[x] += a;
	long long ans = A[x];
	if (l == 0) return ans;
	for (int i = 0; i < children[x].size(); i++) ans += dfs(children[x][i], l - 1, a);
	return ans;
}

void upd(int p, long long v) {
	p++;
	if (p == 0) return;
	for (int i = p; i <= 900000; i += (i & (-i))) fw[i] += v;
}

long long query(int p) {
	p++;
	long long ans = 0;
	for (int i = p; i > 0; i-= (i & (-i))) ans += fw[i];
	return ans;
}

void upd2(int p, long long v) {
	p++;
	if (p == 0) return;
	for (int i = p; i <= 900000; i += (i & (-i))) fw2[i] += v;
}

long long query2(int p) {
	p++;
	long long ans = 0;
	for (int i = p; i > 0; i-= (i & (-i))) ans += fw2[i];
	return ans;
}

void update(int a, int b, int v) {
	upd(a, v);
	upd(b + 1, -v);
	upd2(a, -(long long)(a - 1) * v);
	upd2(b + 1, (long long)(a - 1) * v);
	upd2(b + 1, (long long)(b - a + 1) * v);
}

long long sum(int a, int b) {
	a--;
	return query(b) * b + query2(b) - ((a == -1) ? 0 : (query(a) * a + query2(a)));
}

int main() {
	scanf("%d%d", &N, &Q);
	bool fail = 0;
	for (int i = 0; i < N; i++) {
		int p, s;
		scanf("%d%d", &p, &s);
		update(i, i, s);
		if (p != -1) children[p].push_back(i);
		A[i] = s;
		if (i != p + 1) fail = 1;
	}
	if (N <= 5000 && Q <= 5000) {
		while (Q--) {
			int q;
			scanf("%d", &q);
			if (q == 1) {
				int a, v, x;
				scanf("%d%d%d", &a, &v, &x);
				dfs(a, v, x);
			} else if (q == 2) {
				int a, v;
				scanf("%d%d", &a, &v);
				printf("%lld\n", dfs(a, v, 0));
			} else {
				int a, s;
				scanf("%d%d", &a, &s);
				children[a].push_back(N);
				A[N] = s;
				N++;
			}
		}
	} else if (!fail) {
		while (Q--) {
			int q;
			scanf("%d", &q);
			if (q == 1) {
				int a, v, x;
				scanf("%d%d%d", &a, &v, &x);
				update(a, a + v, x);
			} else if (q == 2) {
				int a, v;
				scanf("%d%d", &a, &v);
				printf("%lld\n", sum(a, a + v));
			} else {
				int a, s;
				scanf("%d%d", &a, &s);
				assert(a == N - 1);
				update(N, N, s);
				N++;
			}
		}
	}
	
}