Cod sursa(job #775452)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 8 august 2012 10:54:20
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include<stdio.h>


using namespace std;

long int n,m,maxim=-1,arbore[300000],a,b,val,poz;



void interogare(long int, long int, long int);
void actualizare(long int, long int, long int);







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

scanf("%ld %ld",&n,&m);
long int i;
for(i=1; i<=n; i++)
{
long long int aux; 
cin>>aux; 
//constructie(1,i,aux,1,n);  
poz=i; val=aux;
actualizare(1,1,n); 
 
 }

for(;m;m--)
{
maxim=-1;
    long int x,y,z;
    scanf("%d %ld %ld",&x,&y,&z);
    //cin>>x>>y>>z;
    if(!x)
	{
	a=y; b=z;
    interogare(1,1,n);
	printf("%lld\n",maxim);

    
	}
	//cout<<interogare(1,1,n,y,z)<<'\n';
    else{ poz=y; val=z;
	actualizare(1,1,n);
    }
	}

    return 0;
}

inline void interogare(long int nod, long int stg, long int drp)
{

	  if(a<=stg && drp<=b){if(arbore[nod]>maxim)maxim=arbore[nod];}
else{
long long int mij=(stg+drp)/2;
if(a<=mij)interogare(2*nod,stg,mij);
if(mij<b)interogare(2*nod+1,mij+1,drp);



}	  
	   
	   
	   
	   
	   }

inline void actualizare(long int nod, long int stg, long int drp)
{

    if(stg==drp && stg==poz){ arbore[nod]=valoare; }
    else
    {
        long int mij=(stg+drp)/2;
        if(poz>mij) actualizare(2*nod+1,mij+1,drp);
        else actualizare(2*nod,stg,mij);
        if(arbore[2*nod]>arbore[2*nod+1])arbore[nod]=arbore[2*nod];
        else arbore[nod]=arbore[2*nod+1];

    }



}