Pagini recente » Cod sursa (job #374699) | Cod sursa (job #904193) | Cod sursa (job #2272963) | Cod sursa (job #1711617) | Cod sursa (job #156253)
Cod sursa(job #156253)
#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;
int Arb[dim], A[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--;
for ( int i = 1; i*size <= N; i++ )
{
Arb[i] = -1;
for ( int nod = size*(i-1)+1; nod <= size*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*size <= N; i++ )
{
if ( X <= size*(i-1)+1 && size*i <= Y )
{
if ( size*(i-1)+1 < st ) st = size*(i-1)+1;
if ( size*i > dr ) dr = size*i;
maxim = Maxim(maxim,Arb[i]);
}
if ( size*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;
}