Cod sursa(job #662771)

Utilizator iulishorIulian Popescu iulishor Data 16 ianuarie 2012 23:19:05
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include<algorithm>  
using namespace std;
int n,m;
int arb[400100];
int start, finish, Val, Pos, maxim;
void Update(int,int,int);
void Query(int,int,int);
int main()
{
    int X, A, B;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        scanf("%d", &X);
        Pos=i;
		Val=X;
        Update(1,1,n);
    }   
    for(int i=1;i<=m;++i)
    {
       f>>X>>A>>B;
        if ( X == 0 ) 
        {
			maxim=-1;
			start=A;
			finish = B;
            Query(1,1,n);
			g<<maxim<<"\n";
		}
        else
        {
            Pos=A;
			Val=B;
            Update(1,1,n);
        }
    }
}
void Update(int nod, int left, int right)
{
	if(left==right)
	{
        arb[nod] = Val;
		return;
	}
	int div=(left+right)/2;
	if(Pos<=div)
		Update(2*nod,left,div);
	else              
		Update(2*nod+1,div+1,right);
	arb[nod] = max( arb[2*nod], arb[2*nod+1] );
}

void Query(int nod, int left, int right)
{
	if(start<=left && right<=finish)
	{
		if(maxim<arb[nod]) 
			maxim=arb[nod];
		return;
	}
	int div=(left+right)/2;
	if(start<=div)
		Query(2*nod,left,div);
	if(div<finish)
		Query(2*nod+1,div+1,right);
}