Cod sursa(job #1213557)

Utilizator ionicaion ionica Data 28 iulie 2014 15:24:56
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include<algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int x[100001],A[200001],n,m;
void creare_arb(int nod,int st_arb,int dr_arb)
{
    int mij;
    if(st_arb==dr_arb)
        A[nod]=x[st_arb];
    else
    {
        mij=(st_arb+dr_arb)/2;
        creare_arb(2*nod,st_arb,mij);
        creare_arb(2*nod+1,mij+1,dr_arb);
        A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}
void actualizare_arb(int nod,int st_arb,int dr_arb,int poz,int val)
{
    int mij;
    if(st_arb==dr_arb)
        A[nod]=val;
    else
    {
    mij=(st_arb+dr_arb)/2;
    if(poz<=mij)
        actualizare_arb(2*nod,st_arb,mij,poz,val);
    else actualizare_arb(2*nod+1,mij+1,dr_arb,poz,val);
    A[nod]=max(A[2*nod],A[2*nod+1]);
    }
}

int interogare_arb(int nod,int st_arb,int dr_arb,int st_x,int dr_x)
{
    int mij,rez,rez1,rez2;
    if(st_x<=st_arb && dr_arb<=dr_x)
        return A[nod];
        else
        {
        mij=(st_arb+dr_arb)/2;
        rez=-1;
        if(st_x<=mij &&st_arb<=dr_x)
           {
               rez1=interogare_arb(2*nod,st_arb,mij,st_x,dr_x);
               rez=max(rez,rez1);
           }

        if(st_x<=dr_arb && mij+1<=dr_x)
            {
            rez2=interogare_arb(2*nod+1,mij+1,dr_arb,st_x,dr_x);
            rez=max(rez,rez2);
            }
        return rez;
        }

}

int main()
{
    int tip,a,b,i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>x[i];
    creare_arb(1,1,n);
    for(i=1;i<=m;i++)
    {

        f>>tip>>a>>b;
        if(tip==1)
            actualizare_arb(1,1,n,a,b);
        else g<<interogare_arb(1,1,n,a,b)<<endl;

    }
    return 0;
}