QOJ.ac

QOJ

Time Limit: 2 s Memory Limit: 16 MB - 512 MB Total points: 100

#10357. Manipulowane drzewo przedziałowe

Statistics

WWT to magik, który niedawno zainteresował się strukturą danych, jaką jest drzewo przedziałowe (segment tree), i zaczął ją modyfikować.

W standardowym drzewie przedziałowym dla przedziału $[l, r]$ wybieramy $mid = \lfloor \frac{l+r}{2} \rfloor$ i dzielimy przedział na $[l, mid]$ oraz $[mid+1, r]$. W drzewie odpowiada to lewemu i prawemu synowi węzła reprezentującego dany przedział.

Magik WWT użył magii wysokiego poziomu, aby złamać tę zasadę. W jego drzewie przedziałowym może on samodzielnie wybierać wartość $mid$ (przy zachowaniu warunku $l \leq mid < r$), co sprawia, że głębokość drzewa może przekroczyć standardowe ograniczenie $O(\log n)$, a złożoność czasowa lokalizacji przedziału może przekroczyć standardowe $O(\log n)$. Pozostałe warunki są zasadniczo takie same jak w standardowym drzewie przedziałowym.

Poniższy rysunek przedstawia drzewo przedziałowe z dowolnie wybranymi wartościami $mid$:

Czym jest lokalizacja przedziału:
Użycie minimalnej liczby przedziałów reprezentowanych przez węzły drzewa, aby pokryć dany przedział, tak aby każda jednostka długości wystąpiła dokładnie raz.
Na przykład w powyższym drzewie, lokalizacja przedziału [2,5] to [2,3], [4,4], [5,5], łącznie trzy.
Łatwo dowieść, że taka lokalizacja przedziału jest unikalna.

Magik WWT nie tylko złamał podstawowe zasady drzewa przedziałowego, ale użył również zakazanej magii, aby zmodyfikować strukturę drzewa. Wykonuje on operacje rotacji w lewo lub rotacji w prawo na wybranych podstrukturach drzewa. Jak pokazano poniżej:

Łatwo zauważyć, że ta zasada rotacji jest podobna do rotacji w strukturze Splay.
① Poddrzewa A, B, C nie ulegają żadnym zmianom.
② Względne położenie poddrzew A, B, C oraz węzłów X, Y ulega zmianie.
③ Zakresy przedziałów węzłów X, Y ulegają zmianie.

Magik WWT poda Ci drzewo przedziałowe z dowolnymi wartościami $mid$. Podczas wykonywania rotacji na niektórych węzłach drzewa, będziesz musiał odpowiadać na zapytania o liczbę elementów w lokalizacji przedziału dla danego przedziału w aktualnym drzewie.

WWT uznał, że takie zadanie nie w pełni oddaje jego wysoki poziom magii, więc dodatkowo zaszyfrował niektóre dane, wymuszając na zawodnikach rozwiązanie typu online.

Wejście

Pierwsza linia zawiera trzy liczby całkowite $N, Q, type$, oznaczające odpowiednio szerokość drzewa przedziałowego, liczbę operacji oraz informację, czy dane są zaszyfrowane. Jeśli $type=0$, dane nie są zaszyfrowane; jeśli $type=1$, dane są zaszyfrowane.

Kolejne $N-1$ linii opisuje drzewo przedziałowe w porządku pre-order (przeszukiwanie w głąb). Każda linia zawiera jedną liczbę całkowitą oznaczającą $mid$ bieżącego węzła wewnętrznego. Gwarantuje się, że dla każdego węzła $l \leq mid < r$. Ponadto, numerujemy wszystkie węzły wewnętrzne zgodnie z kolejnością ich występowania w pre-order, od $1$ do $N-1$.

Podczas wczytywania zaleca się użycie rekurencji i powrót (backtracking) po dotarciu do liścia. Łącznie jest N-1 wartości mid, przy czym każda liczba od 1 do N-1 występuje dokładnie raz.

Następnie następuje $Q$ linii, z których każda reprezentuje operację.

Pierwsza liczba w linii $tp$ oznacza typ operacji:

Jeśli $tp=0$, jest to operacja modyfikacji. Linia zawiera również liczbę całkowitą $x'$. Niech $lastans$ będzie odpowiedzią na ostatnie zapytanie (jeśli wcześniej nie było zapytań, $lastans=0$). Definiujemy $x = x' \oplus (type \times lastans)$. $x$ oznacza numer węzła-syna dla operacji rotacji. Należy wykonać rotację wokół osi utworzonej przez $x$ i jego ojca. Jeśli $x$ jest lewym synem swojego ojca, wykonaj rotację w prawo; jeśli $x$ jest prawym synem, wykonaj rotację w lewo. WWT jest zbyt pewny swojej magii, więc czasami podaje jako $x$ numer korzenia aktualnego drzewa przedziałowego. Jest to niepoprawna operacja modyfikacji; w takim przypadku należy wypisać "BAD!" i nie wykonywać żadnych operacji na drzewie.

Jeśli $tp=1$, jest to operacja zapytania. Linia zawiera również dwie liczby całkowite $l', r'$. Niech $lastans$ będzie odpowiedzią na ostatnie zapytanie (jeśli wcześniej nie było zapytań, $lastans=0$). Definiujemy $l = l' \oplus (type \times lastans)$ oraz $r = r' \oplus (type \times lastans)$. $[l, r]$ oznacza przedział zapytania. Dla każdego zapytania należy podać liczbę elementów w lokalizacji przedziału dla tego przedziału w aktualnym drzewie.

Wyjście

Wyjście powinno zawierać odpowiednią liczbę linii: Dla niepoprawnej operacji modyfikacji wypisz "BAD!". Dla operacji zapytania wypisz liczbę całkowitą będącą odpowiedzią.

Dla poprawnej operacji modyfikacji nie należy nic wypisywać.

Przykład

Wejście 1

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

Wyjście 1

4
3
4
4
2
3
4
1
3
BAD!

Uwagi

Po odszyfrowaniu przykładu:

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

Początkowy kształt drzewa przedziałowego:

$1: [3,6]$ lokalizacja przedziału to $[3,3],[4,4],[5,5],[6,6]$, łącznie $4$.

$2: [2,7]$ lokalizacja przedziału to $[2,3],[4,4],[5,7]$, łącznie $3$.

$3: [2,6]$ lokalizacja przedziału to $[2,3],[4,4],[5,5],[6,6]$, łącznie $4$.

$4:$ Rotacja w prawo wokół węzła $3$ i jego ojca $2$. Kształt po rotacji:

$5: [3,6]$ lokalizacja przedziału to $[3,3],[4,4],[5,5],[6,6]$, łącznie $4$.

$6: [2,7]$ lokalizacja przedziału to $[2,4],[5,7]$, łącznie $2$.

$7: [2,6]$ lokalizacja przedziału to $[2,4],[5,5],[6,6]$, łącznie $3$.

$8:$ Rotacja w prawo wokół węzła $3$ i jego ojca $1$. Kształt po rotacji:

$9: [3,6]$ lokalizacja przedziału to $[3,3],[4,4],[5,5],[6,6]$, łącznie $4$.

$10: [2,7]$ lokalizacja przedziału to $[2,4],[5,7]$, łącznie $2$.

$11: [2,6]$ lokalizacja przedziału to $[2,4],[5,5],[6,6]$, łącznie $3$.

$12:$ Węzeł $3$ jest już korzeniem, niepoprawna operacja modyfikacji, wypisz "BAD!".

Ograniczenia

Dla wszystkich danych, po odszyfrowaniu $l, r, x$ spełniają $1 \leq l \leq r \leq N, 1 \leq x \leq N-1$.

Test $N \leq$ $Q \leq$ Type Modyfikacje Pamięć
1 1000 1000 0 Brak 512MB
2 1000 1000 1 Brak 512MB
3 1000 1000 0 512MB
4 1000 1000 1 512MB
5 200000 200000 0 Brak 512MB
6 200000 200000 0 Brak 512MB
7 200000 200000 0 Brak 512MB
8 200000 200000 0 Brak 512MB
9 200000 200000 1 Brak 512MB
10 200000 200000 1 Brak 512MB
11 200000 200000 1 Brak 512MB
12 200000 200000 0 512MB
13 200000 200000 0 64MB
14 200000 200000 0 16MB
15 200000 200000 1 512MB
16 200000 200000 1 512MB
17 200000 200000 1 64MB
18 200000 200000 1 64MB
19 200000 200000 1 16MB
20 200000 200000 1 16MB

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.