Пожалуйста, подпишитесь на официальный канал Codeforces в Telegram по ссылке https://t.me/codeforces_official. ×

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

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

Новое дерево состоит из 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.