Cod sursa(job #775406)

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


using namespace std;

long int n,m,maxim=-1,arbore[300000];



void interogare(long int, long int, long int, long int, long int);
void actualizare(long int, long int, long int,long int, long long int);
void constructie(long int, long int, long 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);  
actualizare(1,1,n,i,aux); 
 
 }

for(i=1; i<=m; i++)
{

    long int x,y,z;
    scanf("%d %ld %ld",&x,&y,&z);
    //cin>>x>>y>>z;
    if(!x)
	{
    interogare(1,1,n,y,z);
	printf("%lld\n",maxim);
	maxim=-1;
    
	}
	//cout<<interogare(1,1,n,y,z)<<'\n';
    else actualizare(1,1,n,y,z);
}

    return 0;
}

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

	  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,a,b);
if(mij<b)interogare(2*nod+1,mij+1,drp,a,b);



}	  
	   
	   
	   
	   
	   }

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

    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,poz,valoare);
        else actualizare(2*nod,stg,mij,poz,valoare);
        if(arbore[2*nod]>arbore[2*nod+1])arbore[nod]=arbore[2*nod];
        else arbore[nod]=arbore[2*nod+1];

    }



}
inline void constructie(long int nod, long int poz, long long int valoare, long int stg, long int drp)
{

    if(poz<=drp && poz>=stg && drp==stg){ arbore[nod]=valoare;  }

    else if(poz<=drp && poz>=stg)
    {

        if(valoare>arbore[nod])arbore[nod]=valoare;
        long int mij=(stg+drp)/2;
        constructie(2*nod,poz,valoare,stg,mij);
        constructie(2*nod+1,poz,valoare,mij+1,drp);

    }
}