Mai intai trebuie sa te autentifici.
Cod sursa(job #145485)
Utilizator | Data | 28 februarie 2008 21:00:52 | |
---|---|---|---|
Problema | Arbori de intervale | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.31 kb |
#include <stdio.h>
#define MAXN 100005
#define MAXT 262144
int N, M, x[MAXN];
int aint[MAXT];
#define aintCommon m = (l + r) >> 1, lc = (n << 1), rc = lc + 1
inline int max( int a, int b )
{
return (a > b) ? a : b;
}
inline void buildTree( int n, int l, int r )
{
if (l == r)
{
aint[n] = x[l];
return;
}
int aintCommon;
buildTree( lc, l, m );
buildTree( rc, m + 1, r );
aint[n] = max( aint[lc], aint[rc] );
}
inline int query( int n, int l, int r, int Ql, int Qr )
{
if (Ql <= l && r <= Qr)
return aint[n];
int aintCommon;
int rez = -0x3f3f3f3f;
if (Ql <= m)
rez = max( rez, query( lc, l, m, Ql, Qr ) );
if (Qr > m)
rez = max( rez, query( rc, m + 1, r, Ql, Qr ) );
return rez;
}
inline void update( int n, int l, int r, int poz )
{
if (l == r)
{
aint[n] = x[l];
return;
}
int aintCommon;
if (poz <= m)
update( lc, l, m, poz );
else
update( rc, m + 1, r, poz );
aint[n] = max( aint[lc], aint[rc] );
}
int main()
{
freopen("arbint.in", "rt", stdin);
freopen("arbint.out", "wt", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++)
scanf("%d", x + i);
buildTree( 1, 1, N );
for (; M; M--)
{
int type, a, b;
scanf("%d %d %d", &type, &a, &b);
if (type == 0)
printf("%d\n", query( 1, 1, N, a, b ));
else
{
x[a] = b;
update( 1, 1, N, a );
}
}
return 0;
}