History

Time limit: 1.2s Memory limit: 256MB Input: history.in Output: history.out

În timp ce făcea curat în bibliotecă, Henry a găsit o carte despre istoria Taiwanului. Astfel, în carte era scris că Taiwanul anilor 1 7001 \ 700 era format din NN orașe legate între ele prin N1N-1 drumuri, astfel încât între orașele ii și i+1i+1 exista un drum direct.

Printre alte informații, în carte mai era descris protocolul de comunicare între împăratul Chinei, guvernatorul taiwanez responsabil de producția agricolă și primarii celor NN orașe. Astfel, guvernatorul primea, la începutul fiecărui an, de la primarul fiecărui oraș ii o valoare pip_i reprezentând producția agricolă a orașului respectiv. O valoare pozitivă a lui pip_i corespundea unui surplus de grâne în orașul ii, în timp ce o valoare negativă a lui pip_i corespundea unei lipse de grâne.

Apoi, guvernatorul trebuia sa fie pregătit să răspundă la două tipuri de evenimente:

  1. Guvernatorul este informat de primarul orașului xx că producția agricolă pxp_x s-a schimbat la o nouă valoare yy.
  2. Împăratul Chinei cere răspuns la următoarea întrebare: pentru trei valori ll, rr și tt, care era suma maximă Sx,y=px+px+1+...+pyS_{x,y} = p_x + p_{x+1} + ... + p_y, astfel încât lxyrl \leq x \leq y \leq r, la momentul de timp în care avuseseră loc exact tt evenimente de tipul 1.

Henry și-a dat seama că munca guvernatorului era foarte dificilă dat fiind numărul mare de orașe care existau în Taiwan la acea vreme, așa că se întreabă dacă ați putea scrie un program care l-ar fi ajutat în a-și îndeplini atribuțiile.

Interacțiune

Pentru a rezolva această problemă va trebui ca în sursa voastră să existe următoarele 33 funcții:

void initializeValues(int N);

Această funcție primește ca parametru numărul NN de orașe și va fi apelată o singură dată la începutul execuției programului. Pentru a citi valorile inițiale pip_i, va trebui să apelați de NN ori funcția

int readNumber();

, al ii-ulea apel al acestei funcții returnând valoarea pip_i corespunzătoare orașului ii.

void updateValue(int x, int y);

Această funcție corespunde unui eveniment de tipul 11 și primește doi parametri xx și yy semnificând faptul că guvernatorul este informat de primarul orașului xx că noua valoare a lui pxp_x este yy.

long long querySequence(int l, int r, int t);

Această funcție corespunde unui eveniment de tipul 22, și primește trei parametri ll, rr și tt reprezentând o întrebare a împăratului Chinei. Voi trebuie să returnați suma maximă Sx,yS_{x,y} = pxp_x + px+1p_{x+1} + ... + pyp_y, astfel încât lxyrl \leq x \leq y \leq r, corespunzătoare stării șirului pp după ce au fost efectuate exact tt apeluri ale funcției updateValue;

Restricții și precizări

  • 2N200 0002 \leq N \leq 200 \ 000
  • 1M300 0001 \leq M \leq 300 \ 000
  • 1 000 000pi1 000 000-1 \ 000 \ 000 \leq p_i \leq 1 \ 000 \ 000
  • Pentru orice apel al funcției updateValue, 1xN1 \leq x \leq N și 1 000 000y1 000 000-1 \ 000 \ 000 \leq y \leq 1 \ 000 \ 000.
  • Pentru orice apel al funcției querySequence, 1lrN1 \leq l \leq r \leq N și 0tU0 \leq t \leq U, unde UU este numărul de apeluri ale funcției updateValue efectuate până în acel punct în execuția programului.
  • Pentru 30%30\% din teste, funția updateValue va fi apelată de maxim 55 ori.
  • Pentru 100%100\% din teste, funcția updateValue va fi apelată de maxim 30 00030 \ 000 de ori.

Exemplu de interacțiune

grader : initializeValues(3)
concurent : readNumber()
grader : return 2
concurent : readNumber()
grader : return -5
concurent : readNumber()
grader : return 4
concurent : querySequence(1, 3, 0)
grader : return 4
concurent : updateValue(2, -1)
concurent : querySequence(1, 3, 1)
grader : return 5
concurent : querySequence(1, 3, 0)
grader : return 4

Explicație

Funcția initializeValues este apelată cu parametrul N=3N = 3. Concurentul apelează funcția readNumber de 33 ori pentru a citi șirul p=(2,5,4)p = (2, -5, 4).

Eveniment de tip 22: împăratul Chinei întreabă care este suma maximă Sx,yS_{x,y} pentru 1xy31 \leq x \leq y \leq 3, după ce au avut loc 00 evenimente de tip 11. Această sumă maximă este S3,3=4S_{3,3} = 4.

Eveniment de tip 11: Primarul orașului 22 raportează că producția agricolă p2p_2 a devenit 1-1. Șirul pp după ce a avut loc 11 eveniment de tip 11 este p=(2,1,4)p = (2, -1, 4).

Eveniment de tip 22: împăratul Chinei întreabă care este suma maximă Sx,yS_{x,y} pentru 1xy31 \leq x \leq y \leq 3, după ce a avut loc 11 eveniment de tip 11. Întrucât șirul pp era (2,1,4)(2, -1, 4) la acel moment de timp, suma maximă este S1,3=5S_{1,3} = 5.

Eveniment de tip 22: împăratul Chinei întreabă care este suma maximă Sx,yS_{x,y} pentru 1xy31 \leq x \leq y \leq 3, după ce au avut loc 00 evenimente de tip 11. Întrucât șirul pp era (2,5,4)(2, -5, 4) la acel moment de timp, suma maximă este S3,3=4S_{3,3} = 4.

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