Pagini recente » Monitorul de evaluare | Cod sursa (job #2695907) | Cod sursa (job #1410706) | Cod sursa (job #865822) | Cod sursa (job #2129935)
#include <iostream>
#include <fstream>
using namespace std;
ifstream input("arbint.in");
ofstream output("arbint.out");
#define dim 100001
int N, M;
int MaxArb[4*dim+66];
int start, finish, Val, Pos, maxim;
int Maxim(int a, int b) {
if ( a > b ) return a;
return b;
}
void Update(int nod, int left, int right)
{
if(left == right)
{
MaxArb[nod] = Val;
return;
}
int n = left + (right - left)/2;
if(Pos <= n)
Update(2*nod, left, n);
else
Update(2*nod + 1, n + 1, right);
MaxArb[nod] = Maxim(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}
void Search(int nod, int left, int right)
{
if(start <= left && right <= finish)
{
if(maxim < MaxArb[nod])
maxim = MaxArb[nod];
return;
}
int n = left + (right - left)/2;
if(start <= n)
Search(2*nod, left, n);
else
Search(2*nod + 1, n + 1, right);
}
int main()
{
int X, A, B;
input >> N >> M;
for(int i = 0; i < N; i++)
{
input >> X;
Pos = i;
Val = X;
Update(1, 1, N);
}
for(int i = 0; i < M; i++)
{
input >> X >> A >> B;
if(X == 0)
{
maxim = - 1;
start = A;
finish = B;
Search(1, 1, N);
output << maxim << "\n";
}
else
{
Pos = A;
Val = B;
Update(1, 1, N);
}
}
return 0;
}