Cod sursa(job #2381176)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 16 martie 2019 10:43:02
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

int arb[400000];

int n, a[100000], m;

int build(int poz, int s, int f){
    if(s == f){
        arb[poz] = a[s];
        return arb[poz];
    }
    arb[poz] = max(build(poz * 2 + 1, s, (s+f)/2), build(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 + 1, 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 changeElement(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(changeElement(poz * 2 + 1, s, (s + f) / 2, a, b), arb[poz * 2 + 2]);
        return arb[poz];
    }
    arb[poz] = max(arb[poz * 2 + 1], changeElement(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];
    build(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)<<endl;
            continue;
        }
        changeElement(0, 0, n-1, a - 1, b - 1);
    }
    return 0;
}