Cod sursa(job #1427635)

Utilizator retrogradLucian Bicsi retrograd Data 2 mai 2015 18:43:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;
typedef int var;

#define BSIZE 640
#define BCOUNT 5000

var V[100005];
var Buck[BCOUNT];
var n;

void update(var ind, var val) {
    V[ind] = val;
    var b = ind/BSIZE;
    Buck[b] = -1;
    var inc = max(1, b*BSIZE);
    var sf = min(n, (b+1)*BSIZE - 1);
    for(var i=inc; i<=sf; i++)
        Buck[b] = max(Buck[b], V[i]);
}

var query(var l, var r) {
    var i;
    var rez = -1;
    for(i=l; i%BSIZE; i++) {
        if(i > r) return rez;
        rez = max(rez, V[i]);
    }

    for(var b=i/BSIZE; i+BSIZE-1<=r; i+=BSIZE, b++)
        rez = max(rez, Buck[b]);

    for(; i<=r; i++)
        rez = max(rez, V[i]);

    return rez;
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    var m;
    cin>>n>>m;
    for(var i=1; i<=n; i++) {
        cin>>V[i];
        Buck[i/BSIZE] = max(Buck[i/BSIZE], V[i]);
    }

    var type, a, b;

    while(m--) {
        cin>>type>>a>>b;
        if(type == 1) update(a, b);
        else cout << query(a, b) << '\n';
    }
}