Cod sursa(job #642025)

Utilizator ContraPunctContrapunct ContraPunct Data 30 noiembrie 2011 14:03:59
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 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(nod<<2,left,mij,poz,val);
	else
		Update(nod<<2+1,mij+1,right,poz,val);
	MaxArb[nod]=Maxim(MaxArb[nod<<2],MaxArb[nod<<2+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);
        }
    }
	return 0;
}