Pagini recente » Cod sursa (job #602812) | Cod sursa (job #1659360) | Cod sursa (job #1383307) | Cod sursa (job #2359244) | Cod sursa (job #2513445)
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 4 * 100005 + 60; //Maximul sirului
int N, M, Arb[NMAX]; //Variabile basic
int Val, Pos; //Valoarea si pozitia acesteia in sir
int maxim;
int start, finish; //Intervalul
void Update(int, int, int);
void Query(int, int, int);
inline int Max(int a, int b) {
return (a > b) ? a : b;
}
int main()
{
int X, A, B;
fin >> N >> M;
for(int i = 1; i <= N; i++) {
fin >> X;
Pos = i;
Val = X;
Update(1, 1, N);
}
for(int i = 1; i <= M; i++) {
fin >> X >> A >> B;
if(!X) {
maxim = -1;
start = A;
finish = B;
Query(1, 1, N);
fout << maxim << "\n";
}
else {
Pos = A;
Val = B;
Update(1, 1, N);
}
}
}
void Update(int nod, int st, int dr)
{
int mid;
if(st == dr) {
Arb[nod] = Val;
return;
}
mid = (st + dr)/2;
if(Pos <= mid)
Update(2 * nod, st, mid);
else
Update(2 * nod + 1, mid + 1, dr);
Arb[nod] = Max(Arb[2 * nod], Arb[2 * nod + 1]);
}
void Query(int nod, int st, int dr)
{
int mid;
if((start <= st) && (dr <= finish)) {
if(maxim < Arb[nod])
maxim = Arb[nod];
return;
}
mid = (st + dr)/2;
if(start <= mid)
Query(2 * nod, st, mid);
if(mid < finish)
Query(2 * nod + 1, mid + 1, dr);
}