QOJ.ac

QOJ

حد الوقت: 2 s حد الذاكرة: 256 MB مجموع النقاط: 100

#300. Garnek

الإحصائيات

Transformata Fouriera to klasyczny problem, który ma głębokie znaczenie w matematyce, inżynierii i informatyce. Szybka transformata Fouriera (Fast Fourier Transform, FFT), uznawana za jeden z dziesięciu najważniejszych algorytmów XX wieku, pozwoliła znacząco poprawić czasy działania wielu algorytmów. Przykładowo, dzięki niej złożoność obliczeniowa splotu wielomianów została zredukowana z $\Theta\left( n ^ {\log_2 3}\right) \approx \Theta(n^{1.585})$ (algorytm Karatsuby) do $\Theta(n\log n)$ przy użyciu FFT.

Poniżej definiujemy transformatę Fouriera. Niech $\widehat A$ będzie dyskretną transformatą Fouriera ciągu $A$:

$$ \widehat A_i = \sum_{j = 0}^{n - 1} \omega_n^{ij} A_j $$

gdzie $\omega_n^{k} = \mathrm{e}^{2\pi \mathrm{i}k/n}$.

EI ćwiczy na platformie OJ implementację FFT. Jednakże zadanie na tej platformie jest dość nietypowe: serwer wchodzi w interakcję z programem użytkownika, odpytując o wybrane wartości po transformacie i porównując je z wynikami wzorcowymi.

Niestety, platforma ta działa bardzo niestabilnie, głównie z powodu plam na Słońcu, które zmieniają wartości w oryginalnej tablicy, co z kolei wpływa na wyniki FFT. Magiczny wzorzec potrafi za każdym razem przeliczyć wybrany element tablicy po FFT w czasie $\Theta(1)$.

EI zastanawia się, co z tym zrobić i prosi Cię o pomoc.

Skrócona treść zadania: Utrzymuj tablicę, obsługując modyfikacje pojedynczych elementów oraz zapytania o wartości pojedynczych elementów po transformacie Fouriera.

Wejście

W pierwszej linii podano dwie dodatnie liczby całkowite $k, q$, oznaczające długość tablicy $n = 2^k$ oraz liczbę operacji.

W kolejnej linii znajduje się $n$ liczb oznaczających poszczególne elementy tablicy $A_i$.

Następnie podano $q$ linii, z których każda zaczyna się od liczby $opt$ określającej typ operacji, po której następują 1 lub 2 liczby.

$1\ i\ x$ oznacza dodanie $x$ do $A_i$.

$2\ i$ oznacza zapytanie o wartość $\widehat A_i$.

Uwaga: Indeksowanie tablicy zaczyna się od 0, wszystkie dane wejściowe są liczbami całkowitymi.

Wyjście

Dla każdego zapytania wypisz w jednej linii dwie liczby rzeczywiste oznaczające odpowiednio część rzeczywistą i urojoną wyniku.

Wartości powinny być poprawne z dokładnością do $10^{-4}$ względem odpowiedzi wzorcowej.

Przykład

Wejście 1

2 9
1 3 2 -2
2 0
2 1
2 2
2 3
1 2 -1
2 0
2 1
2 2
2 3

Wyjście 1

4 0
-1 5
2 0
-1 -5
3 0
0 5
1 0
0 -5

Ograniczenia

$|A_i|, |x| \le 10$, $1 \le k \le 18$, $1 \le q \le 10^5$, $0 \le i < n$

Podzadanie 1 (8 pkt.): $1 \le k \le 14$, $1 \le q \le 5 \times 10^4$, liczba zapytań $1 \le q_{\text{query}} \le 500$

Podzadanie 2 (14 pkt.): $1 \le k \le 14$, $1 \le q \le 5 \times 10^4$, liczba modyfikacji $1 \le q_{\text{change}} \le 500$

Podzadanie 3 (34 pkt.): $1 \le k \le 16$, $1 \le q \le 5 \times 10^4$

Podzadanie 4 (44 pkt.): $1 \le k \le 18$, $1 \le q \le 10^5$

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.