Олимпиадный тренинг

Задача . C. О меняющемся дереве


Дано корневое дерево, состоящее из n вершин, пронумерованных от 1 до n. Корень дерева находится в вершине с номером 1.

Изначально во всех вершинах записано число 0. Далее приходят q запросов, каждый из которых имеет один из следующих двух видов:

  • Формат запроса: 1 v x k. В ответ на запрос нужно к числу, записанному в вершине v, добавить x; к числам, записанным в потомках вершины v на расстоянии 1, добавить x - k; и так далее, к числам, записанным в потомках на расстоянии i, нужно добавить x - (i·k). Расстоянием между двумя вершинами считается длина кратчайшего по количеству ребер пути между этими вершинами.
  • Формат запроса: 2 v. В ответ на запрос требуется вывести, какое число сейчас записано в вершине v по модулю 1000000007 (109 + 7).

Выполните заданные во входных данных запросы.

Входные данные

В первой строке задано целое число n (1 ≤ n ≤ 3·105) — количество вершин в дереве. Во второй строке задано n - 1 целое число p2, p3, ... pn (1 ≤ pi < i), где pi — это номер вершины, являющейся предком вершины i в дереве.

В третьей строке записано целое число q (1 ≤ q ≤ 3·105) — количество запросов. В следующих q строках заданы запросы, по одному на строке. Первое число в строке type означает тип запроса. Если type = 1, то далее заданы целые числа v, x, k (1 ≤ v ≤ n; 0 ≤ x < 109 + 7; 0 ≤ k < 109 + 7) через пробел. Если type = 2, то далее задано целое число v (1 ≤ v ≤ n) — вершина, в которой нужно узнать значение числа.

Выходные данные

Для каждого запроса второго типа на отдельной строке выведите число, записанное в вершине, обозначенной в запросе, по модулю 1000000007 (109 + 7).

Примечание

О корневом дереве можно прочитать здесь: http://ru.wikipedia.org/wiki/Дерево_(теория_графов).


Примеры
Входные данныеВыходные данные
1 3
1 1
3
1 1 2 1
2 1
2 2
2
1

time 2000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя