Problem I. Indices symmetry

Author:A. Baranov   Time limit:1 sec
Input file:Standard input   Memory limit:256 Mb
Output file:Standard output  

Statement

Young programmer Vasya develops a data storage with a programming interface of multi-dimensional array. Elements of this array are accessed by composite index: (i1, i2, …, iN). Array dimensions are defined by values A1, A2, …, AN (i.e. 0 ≤ ik < Ak, k = 1… N).

Index ranges are non-decreasing (Ak ≤ Ak + 1). A special feature of Vasya's array is index-permutation symmetry. It means that elements with composite indices coinciding up to their permutation are considered equal.

To compactly represent array in memory Vasya decided on the following layout. Elements are stored sequentially row-by-row (aka row-major order) in one-dimensional array, which corresponds to lexicographically increasing composite indices. Those elements for which some permutation of their composite index was already encountered before are skipped.

Your program must execute queries of two kinds.

Input format

Input data starts with an integer N — number of array dimensions.

Followed by N integers Aj — array sizes in each dimension. Next are integer M and M query descriptions, one per line. Queries are of two kinds:

Output format

Output must contain a sequence of integers — result of execution for each query in the order of input. Elements of composite indices must be sorted in ascending order.

Constraints

Indexing of both one-dimensional and multi-dimensional arrays starts with zero.

0 ≤ ij < Aj ≤ 100, Aj ≤ Aj + 1, 1 ≤ N ≤ 10, 1 ≤ M ≤ 105

Sample tests

No. Standard input Standard output
1
5 5 5 5 5 5

8
f 4 4 4 4 4
f 0 1 2 3 4
b 125
f 0 1 1 2 2
f 3 1 4 0 2
b 100
b 49
b 0
125
49
4 4 4 4 4
39
49
1 3 3 3 3
0 1 2 3 4
0 0 0 0 0
2
5 1 2 3 4 5

8
f 0 1 2 3 4
b 27
f 0 1 0 1 3
b 41
b 1
f 0 1 1 2 3
f 0 0 0 0 0
b 0
41
0 0 2 3 4
16
0 1 2 3 4
0 0 0 0 1
33
0
0 0 0 0 0

Explanation

Как следует из условия задачи, для заданного набора (i1, i2, …, iN) нас интересует перестановка с минимальным лексикографическим порядком. Все остальные полагаются тождественными и сводятся к ней путем несложной сортировки. В этом случае каждый последующий индекс не может быть меньше предыдущего, т.е. ik ≤ ik + 1.

Введем два вспомогательных массива L и M, такие что L[k][j] указывает размер подмассива, содержащего все возможные элементы с составными индексами, у которых первые k − 1 элементов равны нулю, а ik = j;
M[k][j] указывает позицию элемента с наименьшим составным индексом, удовлетворяющим описанным выше условиям, в одномерном подмассиве.

Для начала рассмотрим случай, когда k = N.

Здесь все кортежи состоят ровно из одного индекса, и можно получить следующую таблицу значений:
L[N][j] = 1, M[N][j] = j, где j = 0, 1, …, (AN − 1).

Постепенно сдвигаясь к предыдущей размерности, будем использовать следующие формулы:

L[k][j] = L[k + 1][j] + L[k + 1][j + 1] + ⋯  + L[k + 1][Ak + 1],
т.к. соответствующий подмассив не содержит элементов с индексами, у которых ik + 1 < j;

M[k][j] = M[k][j − 1] + L[k][j − 1];
M[k][0] = 0.

После заполнения указанных массивов алгоритм вычисления одномерного индекса выглядит так.

В качестве примера будем искать позицию подмассива, содержащего индексы вида (i1, i2, …).

Можно легко получить позицию подмассива (i1, i1, …), как p1 = M[1][i1].

Также можно получить позицию подмассива (0, i2, …), как p2 = M[2][i2].

Однако p2 также учитывает индексы вида (0, j, …), где j < i1.

Чтобы исключить их, вычтем из него s = M[2][i1].

Таким образом, позиция искомого подмассива определяется как p = p1 + p2 − s.

Заведем массив S, хранящий позиции с поправками на возрастание индексов:
S[k][ik] = M[k][ik] − M[k + 1][ik],
S[N][ik] = M[N][ik].

Последовательно перебирая элементы составного индекса, будем искать сумму значений S[k][ik].
Т.е. мы постепенно наращиваем наш одномерный индекс, смещаясь на заданную поправку.

Обратная задача восстановления составного индекса по его позиции p происходит так.

Перебирая значения k от меньшего к большему, будем искать в массиве M[k]
наибольшее значение, не превосходящее текущего значения p.
Вместе с этим мы найдем индекс подмассива j,
в котором содержится наш текущий элемент.
Далее вычитаем значение S[k][j] из p.
После этого пройденная часть составного индекса может быть отброшена,
и мы продолжим выполнять те же операции,
но уже в пределах меньшего подмассива.


0.130s 0.022s 13