Cod sursa(job #1446787)

Utilizator retrogradLucian Bicsi retrograd Data 2 iunie 2015 21:29:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>

using namespace std;
typedef int var;

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

var sz;
var Tree[262145];

void Build() {
    for(var node=sz-1; node; node--)
        Tree[node] = max(Tree[node*2], Tree[node*2+1]);
}

void Update(var poz, var val) {
    var node = poz+sz-1;
    Tree[node] = val;
    for(node>>=1; node; node>>=1)
        Tree[node] = max(Tree[node*2], Tree[node*2+1]);
}

var Query(var l, var r) {
    var rez = -1;
    for(l += sz-1, r += sz-1; l<=r; l>>=1, r>>=1) {
        if(l & 1)
            rez = max(rez, Tree[l++]);
        if(!(r & 1))
            rez = max(rez, Tree[r--]);
    }
    return rez;
}

int main() {
    var n, m;

    fin>>n>>m;
    for(sz=1; sz<=n; sz<<=1);

    for(var i=1; i<=n; i++) {
        fin>>Tree[i+sz-1];
    }
    Build();

    var type, a, b;
    while(m--) {
        fin>>type>>a>>b;
        if(type == 0) {
            fout<<Query(a, b)<<'\n';
        } else {
            Update(a, b);
        }
    }

    return 0;
}