Cod sursa(job #1242314)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 14 octombrie 2014 11:55:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>


#define DN 100013
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m,v[DN],arb[4*DN];
int op,a,b,rez;

void read(){

    f>>n>>m;
    for(int i=1;i<=n;++i)
        f>>v[i];
}

void build_arb(int nod,int left,int right){

    if(left == right){

        arb[nod] = v[left];
        return;
    }
    int mij = (left+right)/2;

    build_arb(2*nod,left,mij); ///Subarborele stang
    build_arb(2*nod+1,mij+1,right); ///Subarborele drept
    arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}

void update(int nod,int left,int right){

    if(left == right){

        arb[nod] = b;
        return;
    }
    int mij = (left+right)/2;

    if( a <= mij )
        update(2*nod,left,mij);
    else
        update(2*nod+1,mij+1,right);
    arb[nod] = max(arb[2*nod],arb[2*nod+1]);
}

void fnd(int nod,int left,int right){

    if(a <= left && right <= b){

        rez=max(rez,arb[nod]);
        return;
    }

    int mij = (left+right)/2;
    if( a <= mij )
        fnd(2*nod,left,mij);
    if( b > mij)
        fnd(2*nod+1,mij+1,right);
}

void solve(){

    for(;m--;){

        f>>op>>a>>b;

        if(op == 1) /// v[a] = b;
            update(1,1,n);
        else{

            rez = 0;
            fnd(1,1,n);
            g<<rez<<"\n";
        }
    }
}

int main()
{
    read();
    build_arb(1,1,n);
    solve();

    return 0;
}