Cod sursa(job #642023)

Utilizator ContraPunctContrapunct ContraPunct Data 30 noiembrie 2011 13:57:29
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
//#include <stdio.h>
#include <fstream>
//#include <assert.h>  
using namespace std;

ifstream in ("arbint.in");
ofstream out ("arbint.out");
const int dim = 100001;

int N, M;
int MaxArb[dim<<2];
int maxim;

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       return b;
}

void Update(int nod, int left,int right, int poz, int val)
{
	if(left == right)
	{
		MaxArb[nod]=val;
		return;
	}
	int mij = ( left + right)/2;
	if(poz <=mij)
		Update(2*nod,left,mij,poz,val);
	else
		Update(2*nod+1,mij+1,right,poz,val);
	MaxArb[nod]=Maxim(MaxArb[2*nod],MaxArb[2*nod+1]);
}


void Query(int nod,int left,int right,int first,int last)
{
	if(first <= left && right<=last)
	{
		if(maxim < MaxArb[nod])
			maxim = MaxArb[nod];
		return;
	}
	int mij = (left+right)/2;
	if( first <= mij)
		Query(nod*2,left,mij,first,last);
	if( mij < last)
		Query(nod*2+1,mij+1, right, first,last);
}
int main()
{
    int X, A, B;
	in>>N>>M;
    for ( int i = 1; i <= N; i++ )
    {
        in>>X;
        Update(1,1,N,i,X);
    }   
    
    for ( int i = 1; i <= M; i++ )
    {
        in>>X>>A>>B;
        if ( X == 0 ) 
        {
             maxim = -1;
             Query(1,1,N,A,B);
             out<<maxim<<"\n";
        }
        else
        {
            Update(1,1,N,A,B);
        }
    }
}