Cod sursa(job #2701271)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 30 ianuarie 2021 11:48:13
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>



using namespace std;

int arb[400000];
int n, a[100000], m;

int constr(int poz, int s, int f){
    if(s == f){
        arb[poz] = a[s];
        return arb[poz];
    }
    arb[poz] = max(constr(poz * 2 + 1, s, (s+f)/2), constr(poz * 2 + 2, (s+f)/2 + 1, f));
    return arb[poz];
}



int detMax(int poz, int s, int f, int a, int b){
    if(a == s && b == f)
        return arb[poz];
    int mij = (s+f) / 2;
    if(a<=mij && b<=mij)
        return detMax(poz * 2 + 2, s, mij, a, b);
    if(a>mij && b>mij)
        return detMax(poz * 2 + 2, mij + 1, f, a, b);
    return max(detMax(poz * 2 + 1, s, mij, a, mij), detMax(poz * 2 + 2, mij + 1, f, mij + 1, b));

}

int schimbaElem(int poz, int s, int f, int a, int b){
    if(s == f && s == a)
        return arb[poz] = b;
    if(a <= (s + f) / 2){
        arb[poz] = max(schimbaElem(poz * 2 + 1, s, (s + f) / 2, a, b), arb[poz * 2 + 2]);
        return arb[poz];
    }
    arb[poz] = max(arb[poz * 2 + 1], schimbaElem(poz * 2 + 2, (s + f) / 2 + 1, f, a, b));
    return arb[poz];
}



int main(){
    ifstream f("arbint.in");
    f>>n>>m;
    for(int i=0; i<n; i++)
        f>>a[i];
    constr(0, 0, n-1);
    ofstream g("arbint.out");
    for(int i=0; i<m; i++){
        int op;
        f>>op;
        int a, b;
        f>>a>>b;
        if(op == 0){
            g<<detMax(0, 0, n-1, a - 1, b - 1)<<"\n";
            continue;
        }
        schimbaElem(0, 0, n-1, a - 1, b);
    }
    return 0;
}