Cod sursa(job #155688)

Utilizator ScrazyRobert Szasz Scrazy Data 12 martie 2008 08:42:11
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
#define nm 100010

long T[4*nm]; 
long A[nm];
long mx;
long n, m;

inline long max(long a, long b)
{
    return a>b?a:b; 
}

void update(long n, long e, long u, long p, long v)
{
    if (e==u) A[e]=T[n]=v;
    else
    {	
	long mid=(e+u)>>1;
	if (p<=mid) update(2*n, e, mid, p, v);
	else update(2*n+1, mid+1, u, p, v);

	if (T[2*n]>T[2*n+1]) 
	    T[n]=T[2*n];
	else
	    T[n]=T[2*n+1];
    }
}

void query(long n, long e, long u, long i, long j)
{
    if (i<=e && u<=j) mx=max(mx,T[n]);
    else
    {
	long mid=(e+u)>>1;
	if (i<=mid) query(2*n, e, mid, i, j);
	if (j>mid) query(2*n+1, mid+1, u, i, j); 
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout); 

    scanf("%ld%ld", &n, &m);
    for (long i=1; i<=n; ++i) scanf("%ld", A+i), update(1,1,n,i,A[i]);
    
    for (long i=1; i<=m; ++i)
    {
	int x;long i1, i2;scanf("%d%ld%ld", &x, &i1, &i2);
	if (x==0)
	{
	    mx=0;
	    query(1,1,n,i1,i2);
	    printf("%ld\n", mx);
	}
	else update(1,1,n,i1,i2); 
    } 

    return 0; 
}