Cod sursa(job #852832)

Utilizator lucian666Vasilut Lucian lucian666 Data 11 ianuarie 2013 20:07:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb






//Vasilut
#include<fstream>
#define NN 100001
 
const char iname[]="arbint.in";
const char oname[]="arbint.out";
 
using namespace std;
ofstream out(oname);
 
int arb[ 4 * NN + 10 ] , n ,m,maxx;
 
 
void read();
void update(int nod,int left,int right,int position,int value);
void query(int nod,int left,int right ,int start,int finish);
 
int main()
{
    read();
    return 0;
}
 
void read()
{
    ifstream in(iname);
     
    in >> n >> m;
    for(int x,i=1;i<=n;i++)
    {
        in >> x;
        update(1,1,n,i,x);
    }
     
    for(int tip,st,dr ; m ; --m )
    {
        in >> tip >> st >> dr;
         
        if ( tip == 0 )
        {
            maxx = -1;
            query(1,1,n,st,dr);
            out << maxx <<'\n';
        }
        else
         
            if ( tip == 1 )
            {
                update(1,1,n,st,dr);
            }
    }
}
 
void update(int nod,int left,int right,int position,int value)
{
    if ( left == right )
    {
        arb[nod] = value;
        return;
    }
     
    int mid = (left + right ) >> 1;
     
    if ( position <= mid )
        update(  nod << 1 ,left,mid,position,value);
    else
        update( ( nod << 1 ) + 1 , mid+1,right,position,value);
     
    arb[nod] = max ( arb[ nod << 1] ,arb[ ( nod << 1 ) + 1] );
}
 
void query(int nod,int left,int right,int start,int finish)
{
    if ( start <= left && finish >=right )
    {
        maxx = max ( arb[nod] ,maxx );
        return;
    }
     
    int mid = ( left + right ) >> 1;
     
    if ( start<= mid )
        query( nod << 1 , left, mid , start,finish );
	
	if ( mid < finish )
        query( ( nod << 1 ) + 1 , mid+1,right,start,finish );
}