Pagini recente » Cod sursa (job #717320) | Cod sursa (job #698128) | Cod sursa (job #1164768) | Cod sursa (job #1389258) | Cod sursa (job #1452858)
#include <stdio.h>
#include <fstream>
using namespace std;
#define in "arbint.in"
#define out "arbint.out"
#define dim 100001
inline int Maxim(int a, int b) {
if (a > b) return a;
return b;
}
int N, M, X, Y, tip, size, K;
int Arb[dim], A[dim];
int St[dim], Dr[dim];
void Update();
int Query();
int main()
{
freopen(in, "r", stdin);
freopen(out, "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++)
scanf("%d", &A[i]);
size = 0;
while (size*size <= N) size++;
size--;
K = N / size + 1;
for (int i = 1; i*size <= N; i++)
{
Arb[i] = -1;
St[i] = size*(i - 1) + 1, Dr[i] = size*i;
for (int nod = St[i]; nod <= Dr[i]; nod++)
Arb[i] = Maxim(Arb[i], A[nod]);
}
for (; M; M--)
{
scanf("%d%d%d", &tip, &X, &Y);
if (tip) Update();
else printf("%d\n", Query());
}
}
void Update()
{
A[X] = Y;
for (int i = 1; i*size <= N; i++)
if (X >= size*(i - 1) + 1 && X <= size*i)
{
Arb[i] = -1;
for (int nod = size*(i - 1) + 1; nod <= size*i; nod++)
Arb[i] = Maxim(Arb[i], A[nod]);
break;
}
}
int Query()
{
int maxim = -1;
int st = (1 << 30), dr = -1;
for (int i = 1; i <= K; i++)
{
if (X <= St[i] && Dr[i] <= Y)
{
if (St[i] < st) st = St[i];
if (Dr[i] > dr) dr = Dr[i];
maxim = Maxim(maxim, Arb[i]);
}
if (Dr[i] > Y) break;
}
if (st == (1 << 30) && dr == -1) st = dr = Y;
for (int i = X; i <= st; i++)
maxim = Maxim(maxim, A[i]);
for (int i = dr; i <= Y; i++)
maxim = Maxim(maxim, A[i]);
return maxim;
}