Cod sursa(job #1020612)

Utilizator RobertSSamoilescu Robert RobertS Data 2 noiembrie 2013 13:04:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
using namespace std;

int arb[400100], value, pos;
int n, m, start, finish ;
int maxim;

void build_arb(int nod, int left, int right){
    if(left == right){
        arb[nod] = value;
    }else{
        int mij = (left + right) /2;
        if( pos <= mij ) build_arb(2*nod, left, mij);
        else if(pos > mij) build_arb(2*nod+1, mij+1, right);

        if(arb[2*nod] > arb[2*nod+1]) arb[nod] = arb[2*nod];
        else arb[nod] = arb[2*nod+1];
    }


}


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

    if(start <= left && finish >= right){
        if(maxim < arb[nod]) maxim = arb[nod];
    }else{
        int mij = (left+right)/2;
        if(start <= mij) get_max(2*nod,left, mij);
        if(mij < finish) get_max(2*nod+1,mij+1, right);
    }

}

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int main(){
    fin >> n >> m;
    for(int i=1; i<=n; i++){
        fin >> value;
        pos = i; build_arb(1,1,n);
    }
    for(int i=1; i<=m; i++){
        int cmd;
        fin >> cmd;
        if(cmd == 1){
            fin >> pos >> value;
            build_arb(1,1,n);
        }else{
            fin >> start >> finish;
            maxim = -1;
            get_max(1,1,n);
            fout << maxim << '\n';
        }
    }
return 0;
}