C - Mánager de memoria

Languages: C, C++, Java, JavaScript, Pascal, Tiger, Haskell, Python, C#
Time & Memory limits: (details)

Si crees que éste es el problema difícil de la competencia te equivocas, éste es el muy difícil. Veamos de qué se trata.

Una de las mayores innovaciones del último sistema operativo de Windows es su mánager de memoria. Este trabaja con una array de tamaño N, y permite llevar a cabo tres tipos de operaciones:

Imprimir(l, r)  - imprime los elementos del array de l a r, incluyendo los extremos.

Suma(l, r) - devuelve la suma de los elementos del array que se encuentran en el intervalo [l, r]

Copia(a, b, l) - Copia los elementos del intervalo [a, a + l – 1] al intervalo [b, b + l – 1], en otras palabras, reemplaza el segundo intervalo con el primero.

Tú eres el desarrollador de un sistema operativo y quieres tener un mánager de memoria con estas mismas características.

Input

La primera línea contiene un entero N (1 <= N <= 1 000 000) – el tamaño del array con el que se va a trabajar.

La segunda línea contiene cuatro números 1 <= X 1 , A, B, M <= 10 ^ 9 + 10. Con ellos tu puedes generar a los valores iniciales del array X 1 , X 2 , …, X N , X i+1 = (A * X i + B) % M.

La siguiente línea contiene un entero K (1 <= K <= 200 000) – la cantidad de pedidos que debes responder.

cpy a b l – representa la operación de copiar

sum l r – representa la operación de sumar (l <= r)

out l r – representa la operación de imprimir (l <= r)

Se garantiza que la cantidad de elementos a imprimir en total no excede 3000. También se asegura que todos los pedidos son válidos.

Output

Por cada pedido out o sum se debe imprimir en un línea la respuesta de la pregunta.

Sample test(s)

Input
6 1 4 5 7 8 out 1 6 sum 1 6 cpy 1 3 2 out 3 4 sum 3 4 cpy 1 2 4 out 1 6 sum 1 6
Output
1 2 6 1 2 6 18 1 2 3 1 1 2 1 2 6 13