Cod sursa(job #1098291)

Utilizator raulmuresanRaul Muresan raulmuresan Data 4 februarie 2014 18:22:37
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <algorithm>

using namespace std;
int i,aux,n,k,j,p,v[101009],m,st,s,stmax,drmax,smax,nr,sol,x,y,caz,arbore[400010],a,b,maxim,val;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

void query(int nod, int left, int right)
{
     if ( a <= left && right <= b )
     {
         maxim=max(maxim,arbore[nod]);
         return ;

     }

     int mijloc = (left+right)/2;
     if ( a <= mijloc ) query(2*nod,left,mijloc);
     if ( mijloc < b ) query(2*nod+1,mijloc+1,right);
}

void update(int nod,int left,int right)
{
    if(left==right) //am gasit nodul si ii schimbam valoarea
    {
        arbore[nod]=val;
    }
    else
    {
        int mijloc=(left+right)/2;
        if(a<=mijloc)
        {
            update(2*nod,left,mijloc);
        }
        //if(mijloc+1<=a)
        else
        {
            update(2*nod+1,mijloc+1,right);
        }
        arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
    }
}
int main()
{


    fin>>n>>m;
    //citire si construirea arborelui binar
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        val=v[i];
        a=i;
        update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
        fin>>caz>>a>>b;
        if(caz==0)
        {
            maxim=0;
            query(1,1,n);
            fout<<maxim<<"\n";
        }
        else
        {
            val=b;
            update(1,1,n);
        }
    }
}