У Айбара есть сад, который состоит из KK подряд идущих грядок. В саду живут nn кроликов. Каждый кролик находится в одной из грядок. Иногда кролики могут переходить в соседние грядки. Также, иногда Айбару нужно узнать количество кроликов, которые находятся на каком-то отрезке, чтобы их покормить. Айбару дано qq запросов, которые надо обработать. Они бывают следующих типов:
Кролик номер x(1≤x≤n)x(1≤x≤n) перешел на одну грядку налево или направо. При этом гарантируется, что кролик не выйдет за пределы сада
Посчитать количество кроликов на отрезке от грядки ll до грядки rr (1≤l≤r≤K)(1≤l≤r≤K) включительно.
Входные данные
В первой строке входных данных даны два числа - nn и KK. Далее во второй строке указаны nn чисел - изначальное положение каждого кролика. Затем в отдельной строке следует число qq и qq строк описывающих запросы. Запросы задаются в следующем формате:
L xL x - сдвинуть кролика номер xx на одну грядку налево
R xR x - сдвинуть кролика номер xx на одну грядку направо
G lrG lr - Посчитать и вывести количество кроликов на отрезке от грядки ll до грядки rr включительно.
Выходные данные
В выходные данные выведите по одному числу для каждого запроса третьего типа в отдельной строке.
#include <bits\stdc++.h>
using namespace std; #define ll long long #define pb push_back #define fi first #define se second
// solve it
const ll mod = 1e9 + 7;
В массиве а[v] записал число кроликов в каждой норке и в массиве t[v] сделал дерево отрезков.
когда надо было сдвинуть кроликов в другую норку я отнимал на 1 число кроликов в текущей норке и смотря на направление прибавлял на 1 в соседней и активировал процедуру build еще раз. А при выводе выбирал с дерево блоки которые входили в отрезок l и r.
Пересчитывание дерева отрезков работает слишком долго. Заметь что при каждом запросе на сдвиг кролика меняются не все вершины а только 2. Можно создать новый запрос который прибавляет какое то число в точке.