Î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 era format din orașe legate între ele prin drumuri, astfel încât între orașele și 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 orașe. Astfel, guvernatorul primea, la începutul fiecărui an, de la primarul fiecărui oraș o valoare reprezentând producția agricolă a orașului respectiv. O valoare pozitivă a lui corespundea unui surplus de grâne în orașul , în timp ce o valoare negativă a lui corespundea unei lipse de grâne.
Apoi, guvernatorul trebuia sa fie pregătit să răspundă la două tipuri de evenimente:
- Guvernatorul este informat de primarul orașului că producția agricolă s-a schimbat la o nouă valoare .
- Împăratul Chinei cere răspuns la următoarea întrebare: pentru trei valori , și , care era suma maximă , astfel încât , la momentul de timp în care avuseseră loc exact 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 funcții:
void initializeValues(int N);
Această funcție primește ca parametru numărul de orașe și va fi apelată o singură dată la începutul execuției programului. Pentru a citi valorile inițiale , va trebui să apelați de ori funcția
int readNumber();
, al -ulea apel al acestei funcții returnând valoarea corespunzătoare orașului .
void updateValue(int x, int y);
Această funcție corespunde unui eveniment de tipul și primește doi parametri și semnificând faptul că guvernatorul este informat de primarul orașului că noua valoare a lui este .
long long querySequence(int l, int r, int t);
Această funcție corespunde unui eveniment de tipul , și primește trei parametri , și reprezentând o întrebare a împăratului Chinei. Voi trebuie să returnați suma maximă = + + ... + , astfel încât , corespunzătoare stării șirului după ce au fost efectuate exact apeluri ale funcției updateValue
;
Restricții și precizări
- Pentru orice apel al funcției
updateValue
, și . - Pentru orice apel al funcției
querySequence
, și , unde este numărul de apeluri ale funcțieiupdateValue
efectuate până în acel punct în execuția programului. - Pentru din teste, funția
updateValue
va fi apelată de maxim ori. - Pentru din teste, funcția
updateValue
va fi apelată de maxim 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 . Concurentul apelează funcția readNumber
de ori pentru a citi șirul .
Eveniment de tip : împăratul Chinei întreabă care este suma maximă pentru , după ce au avut loc evenimente de tip . Această sumă maximă este .
Eveniment de tip : Primarul orașului raportează că producția agricolă a devenit . Șirul după ce a avut loc eveniment de tip este .
Eveniment de tip : împăratul Chinei întreabă care este suma maximă pentru , după ce a avut loc eveniment de tip . Întrucât șirul era la acel moment de timp, suma maximă este .
Eveniment de tip : împăratul Chinei întreabă care este suma maximă pentru , după ce au avut loc evenimente de tip . Întrucât șirul era la acel moment de timp, suma maximă este .