Pagini recente » Subarbore | Felinare | hiperquery | Turnuri2 | Cod sursa (job #348544)
Cod sursa(job #348544)
#include <iostream>
#include <fstream>
using namespace std;
#define fin "arbint.in"
#define fout "arbint.out"
#define NMAX 100000
int N, M, arb[4 * NMAX];
int stTarget, drTarget, ret, value;
inline int maxf(int a, int b) { return ( a < b ) ? (b) : (a); }
void insert(int nod, int st, int dr)
{
if ( st == dr )
{
arb[ nod ] = value;
return ;
}
int mid = st + (dr - st)/2;
if ( stTarget <= mid )
insert(2*nod,st,mid);
else
insert(2*nod + 1,mid + 1, dr);
arb[nod] = maxf(arb[2*nod],arb[2*nod+1]);
}
void query(int nod, int st, int dr)
{
if ( stTarget <= st && dr <= drTarget )
{
ret = maxf(ret,arb[nod]);
return ;
}
int mid = st + (dr-st)/2;
if ( stTarget <= mid )
query(2*nod,st,mid);
if ( drTarget > mid )
query(2*nod+1,mid + 1,dr);
}
int main()
{
int i, a, b, op;
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d%d",&N,&M);
for ( i = 1; i <= N; ++i )
{
stTarget = i;
scanf("%d",&value);
insert(1,1,N);
}
for ( i = 1; i <= M; ++i )
{
scanf("%d%d%d",&op,&a,&b);
if ( op == 0 )
{
ret = 0;
stTarget = a;
drTarget = b;
query(1,1,N);
printf("%d\n",ret);
}
else
{
value = b;
stTarget = a;
insert(1,1,N);
}
}
return 0;
}