Cod sursa(job #1427636)

Utilizator retrogradLucian Bicsi retrograd Data 2 mai 2015 18:45:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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;
}

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

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

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

    var type, a, b;

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