afaceri

Time limit: 1.25s Memory limit: 128MB Input: afaceri.in Output: afaceri.out

Ana are o afacere cu un şir SS format din NN litere mici, memorate pe poziţiile 0,1,,N10, 1, \dots, N-1. Şirul este considerat circular (adică după litera de pe poziţia N1N-1 se consideră că urmează litera de pe poziţia 00).
Asupra acestui şir Ana trebuie să efectueze eficient următoarele operaţii:

  1. Update(poz,c)Update(poz, c): schimbă litera de pe poziţia poz din şir în litera cc
  2. Query(poz1,poz2,len)Query(poz_1, poz_2, len): consideră subsecvenţa din şir care începe pe poziţia poz1poz_1 şi subsecvenţa care începe pe poziţia poz2poz_2, ambele secvenţe având lungimea lenlen, şi determină distanţa Hamming dintre cele două subsecvenţe.

Distanţa Hamming dintre două subsecvenţe s1s_1 şi s2s_2 de lungime lenlen este definită ca numărul de poziţii ii pentru care s1[i]s2[i]s_{1[i]} \neq s_{2[i]}, 0i<len0 \leq i < len.

Pentru că volumul datelor de intrare este mare, vom genera operaţiile asupra şirului pe baza unor valori date, după cum urmează:
MM - numărul total de operaţii;
QQ - frecvenţa operaţiilor Update (după fiecare Q1Q-1 operaţii Query se execută un Update);

L A0 A1 A2 RL \ A_0 \ A_1 \ A_2 \ R - valori (iniţial date) în funcţie de care generăm operaţiile.
Vectorii XX cu LXL_X elemente naturale şi respectiv YY cu LYL_Y elemente naturale conţin valori utilizate de asemenea pentru generarea operaţiilor (vectorii XX şi YY fiind indexaţi de la 00).
Pseudocodul care descrie modul de generare a operaţiilor Update/Query:

for (i = 1; i <= M; i++)
    {if (i % Q == 0) // generez o operatie Update
         {poz=A1%N; c='a' + A2 % 26;	    
          S[poz] = c; }
	    else //generez o operatie Query
          { poz1 = A0%N; poz2=A1%N; len=L+A2%(N-L+1); }
      //recalculez A0 A1 A2 	     
      VAL = ((long long)A2*X[i%LX]+Y[i%LY])%R; A0 = A1; A1 = A2; A2 = VAL; 
    }

Cerinţă

Scrieţi un program care să efectueze operaţiile generate şi să determine suma răspunsurilor la operaţiile Query.

Date de intrare

Fişierul de intrare afaceri.in va conţine pe prima linie numerele naturale N,M,Q,L,A0,A1,A2N, M, Q, L, A_0, A_1, A_2 şi RR. A doua linie va conţine numărul natural LXL_X, apoi vor urma LXL_X numere naturale X0 X1XLX1X_0 \ X_1 \dots X_{L_X-1} reprezentând valorile vectorului XX. A treia linie va conţine numărul natural LYL_Y, apoi vor urma LYL_Y numere naturale Y0 Y1YLY1Y_0 \ Y_1 \dots Y_{L_Y-1} reprezentând valorile vectorului YY. A patra linie va conţine NN litere mici reprezentând şirul dat. Valorile numerice aflate pe aceeaşi linie sunt separate prin spaţii.

Date de ieșire

Fişierul de ieşire afaceri.out va conţine o singură linie pe care va fi scris un singur număr natural reprezentând suma răspunsurilor la query-urile date.

Restricții și precizări

  • 1L<N2 0001 \leq L < N \leq 2 \ 000;
  • 1LX,LY5 0001 \leq L_X, L_Y \leq 5 \ 000;
  • 1M2 000 0001 \leq M \leq 2 \ 000 \ 000;
  • 1MQ20 0011 \leq \frac{M}{Q} \leq 20 \ 001
  • 1XiR,1YiR,i1 \leq X_i \leq R, 1 \leq Y_i \leq R, \forall i
  • 1A0,A1,A2,R1 000 0001 \leq A_0, A_1, A_2, R \leq 1 \ 000 \ 000;

Exemplu

afaceri.in

7 15 4 3 5 6 7 8
3 5 4 1
3 7 2 6
lrqagor

afaceri.out

65

Log in or sign up to be able to send submissions!