Cod sursa(job #2032597)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 5 octombrie 2017 14:24:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

#define Nmax 100011

using namespace std;

int v[Nmax],aint[2*Nmax],n,m;

void update (int st , int dr , int pos , int nod)
{
    if (st==dr)
    {
        aint[nod]=v[pos];
    }
    else
    {
        int mij=(st+dr)/2;
        if (pos<=mij)
        {
            update(st , mij ,pos ,nod*2);
        }
        else
        {
            update (mij+1,dr,pos ,nod *2+1);
        }
            aint[nod]=max(aint[2*nod],aint[2*nod+1]);
    }
}

int query (int st , int dr , int p1 , int p2 , int nod)
{
    if (st==p1 && dr==p2)
    {
        return aint[nod];
    }
    else
    {
        int mij =(st+dr)/2;
        if (p2<=mij)
        {
            return query (st , mij , p1 , p2 , nod*2);
        }
        else
        {
            if (p1>mij)
            {
                return query(1+mij,dr,p1,p2,2*nod+1);
            }
            else
            {
                return max ( query(st , mij , p1 , mij , 2*nod) , query(mij+1 , dr , mij+1 , p2 ,2*nod+1) );
            }
        }
    }
}

int main()
{
    ifstream fin ("arbint.in");
    ofstream fout ("arbint.out");
    fin>>n>>m;
    for (int i=1;i<=n;++i)
    {
        fin>>v[i];
        update (1 , n , i , 1);
    }
    for (int j=1; j<=m;++j)
    {
        int p,a,b;
        fin>>p>>a>>b;
        if (p==1)
        {
            v[a]=b;
            update (1 , n , a , 1);
        }
        else
        {
            fout<<query (1 , n , a , b , 1)<<"\n";
        }
    }
}