Cod sursa(job #251788)

Utilizator eugen.nodeaEugen Nodea eugen.nodea Data 3 februarie 2009 13:27:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
# include <stdio.h>
# define dim 100001

int N, M;
int Arb[4*dim+66];
int start, finish, Val, Pos, maxim;

int Maxim(int a, int b) {
       if (a>b) return a;
       return b;
}
void Upd(int nod, int st, int dr)
{
   int mij;
   if (st==dr) Arb[nod] = Val;
        else {	
     		mij = (st+dr)/2;
     		if (Pos<=mij) Upd(2*nod,st,mij);
		  	 else Upd(2*nod+1,mij+1,dr);
	        Arb[nod]=Maxim(Arb[2*nod], Arb[2*nod+1]);
	    }	
}
void Query(int nod, int st, int dr)
{
     if ( start <= st && dr <= finish ){
	  if ( maxim < Arb[nod] ) maxim = Arb[nod];
	  return;
     }
     int mij = (st+dr)/2;
     if ( start <= mij ) Query(2*nod,st,mij);
     if ( mij < finish ) Query(2*nod+1,mij+1,dr);
}

int main()
{
    int op, A, B,i;
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d %d", &N, &M);
    for (i = 1; i <= N; i++ ){
	scanf("%d", &Val);
	Pos = i;
	Upd(1,1,N);
    }
    for (i = 1; i <= M; i++ ){
	scanf("%d %d %d", &op, &A, &B);
	if ( op == 0 ){
	     maxim=-1;
	     start=A, finish=B;
	     Query(1,1,N);
	     printf("%d\n", maxim);
	   }
	else {
	    Pos = A, Val = B;
	    Upd(1,1,N);
	}
    }
    return 0;
}