Cod sursa(job #1446788)

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

using namespace std;
typedef int var;

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

var sz;
var Tree[262145];

#define DIM 100000
char buff[DIM];
var poz;
void Read(var &a) {
    while(!isdigit(buff[poz]))
        if(++poz == DIM)
            fin.read(buff, DIM), poz=0;
    a = 0;
    while(isdigit(buff[poz])) {
        a = a * 10 + buff[poz] - '0';
        if(++poz == DIM)
            fin.read(buff, DIM), poz=0;
    }
}

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() {
    fin.read(buff, DIM);
    var n, m;

    Read(n); Read(m);
    for(sz=1; sz<=n; sz<<=1);

    for(var i=1; i<=n; i++)
        Read(Tree[i+sz-1]);

    Build();

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

    }

    return 0;
}