Cod sursa(job #766383)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 11 iulie 2012 09:51:04
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include<stdio.h>


using namespace std;

long int n,m,arbore[300000];

void constructie(long int nod, long int poz, long long int valoare, long int stg, long int drp)
{

    if(poz<=drp && poz>=stg && drp==stg){ arbore[nod]=valoare;  }

    else if(poz<=drp && poz>=stg)
    {

        if(valoare>arbore[nod])arbore[nod]=valoare;
        long int mij=(stg+drp)/2;
        constructie(2*nod,poz,valoare,stg,mij);
        constructie(2*nod+1,poz,valoare,mij+1,drp);

    }
}


long long int interogare(long int nod, long int stg, long int drp, long int a, long int b)
{

    if(drp<a || stg >b)return -1;
    else if(a<=stg && drp<=b)return arbore[nod];
    else{

    long int mij=(stg+drp)/2;
    long long int stanga,dreapta;

    stanga=interogare(2*nod,stg,mij,a,b);
    dreapta=interogare(2*nod+1,mij+1,drp,a,b);
    if(stanga>dreapta)return stanga;
    else return dreapta;

       }
}


void actualizare(long int nod, long int stg, long int drp,long int poz, long long int valoare)
{

    if(stg==drp && stg==poz){ arbore[nod]=valoare; }
    else
    {
        long int mij=(stg+drp)/2;
        if(poz>mij) actualizare(2*nod+1,mij+1,drp,poz,valoare);
        else actualizare(2*nod,stg,mij,poz,valoare);
        if(arbore[2*nod]>arbore[2*nod+1])arbore[nod]=arbore[2*nod];
        else arbore[nod]=arbore[2*nod+1];

    }



}




int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

cin>>n>>m;
long int i;
for(i=1; i<=n; i++){long long int aux; cin>>aux; constructie(1,i,aux,1,n);   }

for(i=1; i<=m; i++)
{

    long int x,y,z;
    cin>>x>>y>>z;
    if(!x)
    cout<<interogare(1,1,n,y,z)<<'\n';
    else actualizare(1,1,n,y,z);
}








    return 0;
}