Cod sursa(job #798668)

Utilizator lucian666Vasilut Lucian lucian666 Data 16 octombrie 2012 21:52:46
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb


//Vasilut
#include<fstream>
#define NN 100001

using namespace std;
ofstream out("arbint.out");

int arb[4 * NN + 1] ,n,m,maxx;

void read();
void make(int radacina,int left,int right,int valoare,int insert_position);
void query(int radacina,int left,int right,int start,int finish);

int main()
{
    read();
    return 0;
}

void read()
{
    ifstream in("arbint.in");
    in>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        in>>x;
        make(1,1,n,x,i);
    }
    for(int type,st,dr; m ; --m)
    {
        in>>type>>st>>dr;
        if( type == 0)
        {
            maxx=-1;
            query(1,1,n,st,dr);
            out<<maxx<<'\n';
        }
        else
            make(1,1,n,dr,st);
    }
}

void make(int radacina,int left,int right,int valoare,int insert_position)
{
    if(left==right)
    {
        arb[radacina]=valoare;
        return;
    }
    int mid;
    mid=(left + right) >> 1;
    if( insert_position <=mid)
        make(2 * radacina,left,mid,valoare,insert_position);
        else
        make(2 * radacina+1,mid+1,right,valoare,insert_position);
        arb[radacina]=max(arb[2*radacina],arb[2*radacina+1]);
}

void query(int radacina,int left,int right,int start,int finish)
{
    if(start<=left && finish>=right)
    {
        if(arb[radacina] > maxx)
        maxx=arb[radacina];
        return ;
    }
    int mid;
    mid=(left + right ) >> 1;
    if( start<=mid)
    query( 2*radacina,left,mid,start,finish);
    else
    query( 2*radacina+1,mid+1,right,start,finish);
}