B. Сережа и дерево
ограничение по времени на тест
2 секунды
ограничение по памяти на тест
256 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

Сережа очень любит деревья. Сегодня он придумал совершенно новый вид корневых бинарных деревьев.

Новое дерево состоит из n уровней, а каждая вершина проиндексирована двумя целыми числами: номером уровня и номером вершины на текущем уровне. Корень дерева находится на уровне 1 и имеет индекс (1, 1). Далее следует псевдокод построения дерева.


//глобальные данные - целочисленные массивы cnt[], left[][], right[][]

cnt[1] = 1;
заполнить массивы left[][], right[][] значениями -1;
for(level = 1; level < n; level = level + 1){
cnt[level + 1] = 0;
for(position = 1; position <= cnt[level]; position = position + 1){
if(значение position является степенью двойки){ // то есть 1, 2, 4, 8...
left[level][position] = cnt[level + 1] + 1;
right[level][position] = cnt[level + 1] + 2;
cnt[level + 1] = cnt[level + 1] + 2;
}else{
right[level][position] = cnt[level + 1] + 1;
cnt[level + 1] = cnt[level + 1] + 1;
}
}
}

После выполнения псевдокода в ячейке cnt[level] хранится количество вершин на уровне level. В ячейке left[level][position] хранится номер вершины на уровне level + 1, которая является левым сыном вершины с индексом (level, position), или хранится -1, если левого сына у вершина нет. Аналогично, ячейка right[level][position] отвечает за правого сына. В примечаниях можно посмотреть, как выглядит дерево, для n = 4.

Сережа любит все усложнять, поэтому сначала Сережа построил дерево, а потом для каждой вершины дерева Сережа завел пустое множество A(level, position). Далее Сережа выполняет m операций. Каждая операция имеет один из двух следующих видов:

  • Формат операции «1 t l r x». Для всех вершин level, position (level = tl ≤ position ≤ r) добавить значение x в множество A(level, position).
  • Формат операции «2 t v». Для вершины level, position (level = t, position = v) найти объединение всех множеств вершин, находящихся в поддереве вершины (level, position). Вывести размер объединения этих множеств.

Помогите Сереже выполнить операции. В этой задаче считается, что множество содержит в себе различные элементы как std::set в C++.

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

Первая строка содержит целые числа n и m (1 ≤ n, m ≤ 7000).

Следующие m строк содержат описания операций. Операция первого типа задается пятью целыми числами: 1 t l r x (1 ≤ t ≤ n; 1 ≤ l ≤ r ≤ cnt[t]; 1 ≤ x ≤ 106). Операция второго типа задается тремя целыми числами: 2 t v (1 ≤ t ≤ n; 1 ≤ v ≤ cnt[t]).

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

Для каждой операции второго типа выведите ответ в отдельной строке.

Примеры
Входные данные
4 5
1 4 4 7 1
1 3 1 2 2
2 1 1
2 4 1
2 3 3
Выходные данные
2
0
1
Примечание

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

Ниже нарисовано построенное дерево для n = 4.