Codeforces Round 240 (Div. 1)
C
Mashmokh and Reverse Operation
Codeforces
2100
原题
← BD →
翻译中…

Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university and participate in ACM instead of finding a new job. He wants to become a member of Bamokh's team. In order to join he was given some programming tasks and one week to solve them. Mashmokh is not a very experienced programmer. Actually he is not a programmer at all. So he wasn't able to solve them. That's why he asked you to help him with these tasks. One of these tasks is the following.

翻译中…

You have an array $*a*$ of length $2^{*n*}$ and $*m*$ queries on it. The $*i*$-th query is described by an integer $*q*_{*i*}$. In order to perform the $*i*$-th query you must:

翻译中…
  • split the array into $2^{*n* - *q*_{*i*}}$ parts, where each part is a subarray consisting of $2^{*q*_{*i*}}$ numbers; the $*j*$-th subarray $(1 ≤ *j* ≤ 2^{*n* - *q*_{*i*}})$ should contain the elements $*a*[(*j* - 1)·2^{*q*_{*i*}} + 1], *a*[(*j* - 1)·2^{*q*_{*i*}} + 2], ..., *a*[(*j* - 1)·2^{*q*_{*i*}} + 2^{*q*_{*i*}}]$;
  • reverse each of the subarrays;
  • join them into a single array in the same order (this array becomes new array $*a*$);
  • output the number of inversions in the new $*a*$.
翻译中…

Given initial array $*a*$ and all the queries. Answer all the queries. Please, note that the changes from some query is saved for further queries.

翻译中…

Input

翻译中…

The first line of input contains a single integer $*n* (0 ≤ *n* ≤ 20)$.

翻译中…

The second line of input contains $2^{*n*}$ space-separated integers $*a*[1], *a*[2], ..., *a*[2^{*n*}] (1 ≤ *a*[*i*] ≤ 10^{9})$, the initial array.

翻译中…

The third line of input contains a single integer $*m* (1 ≤ *m* ≤ 10^{6})$.

翻译中…

The fourth line of input contains $*m*$ space-separated integers $*q*_{1}, *q*_{2}, ..., *q*_{*m*} (0 ≤ *q*_{*i*} ≤ *n*)$, the queries.

翻译中…

Note: since the size of the input and output could be very large, don't use slow output techniques in your language. For example, do not use input and output streams (cin, cout) in C++.

翻译中…

Output

翻译中…

Output $*m*$ lines. In the $*i*$-th line print the answer (the number of inversions) for the $*i*$-th query.

翻译中…

Note

翻译中…

If we reverse an array $*x*[1], *x*[2], ..., *x*[*n*]$ it becomes new array $*y*[1], *y*[2], ..., *y*[*n*]$, where $*y*[*i*] = *x*[*n* - *i* + 1]$ for each $*i*$.

翻译中…

The number of inversions of an array $*x*[1], *x*[2], ..., *x*[*n*]$ is the number of pairs of indices $*i*, *j*$ such that: $*i* < *j*$ and $*x*[*i*] > *x*[*j*]$.

翻译中…

样例

Input #1
2
2 1 4 3
4
1 2 0 2
Output #1
0
6
6
0
InputCopy OutputCopy
Input #2
1
1 2
3
0 1 1
Output #2
0
1
0
InputCopy OutputCopy
题目信息
题号
414C
时间限制
4 s
内存限制
512 MB
标签
组合数学
分治

题面与样例版权归 Codeforces 及出题人所有;中文翻译由 AI 生成(CI 管线),如有出入请以原文为准。