Cod sursa(job #852453)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 11 ianuarie 2013 11:56:39
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;

const int Nmax = 100001;

ofstream g("arbint.out");

int V[Nmax], N, M, Q, rad, lo, hi, poz, val;
vector<int> st, dr, arb;
char *buff;
int ind, lenght;

void update() {

    int i, j;

    V[poz] = val;
    for(i=1; i<=Q; ++i)
        if(st[i] <= poz && poz <= dr[i]) {
            arb[i] = -1;
            for(j=st[i]; j<=dr[i]; ++j)
                arb[i] = max(arb[i], V[j]);
        }
}

int query() {

    int i, rez, left, right;

    rez = -1;
    left = 1<<30;
    right = -1;

    for(i=1; i<=Q; ++i) {
        if(lo <= st[i] && dr[i] <= hi) {
            left = min(left, st[i]);
            right = max(right, dr[i]);
            rez = max(rez, arb[i]);
        }
        if(hi > dr[i])
            break;
    }

    if(left == 1<<30 && right == -1)
        left = right = hi;

    for(i=lo; i<=left; ++i)
        rez = max(rez, V[i]);
    for(i=right; i<=hi; ++i)
        rez = max(rez, V[i]);

    return rez;
}

void build() {

    int i, j;

    for(rad=1; rad*rad<=N; ++rad);
    --rad;
    Q = N/rad + 1;

    st.resize(Q+1);
    dr.resize(Q+1);
    arb.resize(Q+1);

    for(i=1; i<=Q; ++i) {
        arb[i] = -1;
        st[i] = rad*(i-1)+1;
        dr[i] = rad*i;
        for(j=st[i]; j<=dr[i]; ++j)
            arb[i] = max(arb[i], V[j]);
    }
}

int get_number() {

    int number = 0;

    while(ind<lenght && !(buff[ind]>='0' && buff[ind]<='9'))
        ++ind;

    while(ind<lenght && buff[ind]>='0' && buff[ind]<='9') {
        number = number * 10 + buff[ind] - '0';
        ++ind;
    }

    return number;
}

int main() {

    ifstream f;
    f.open("arbint.in");
    f.seekg(0, ios::end);
    lenght = f.tellg();
    buff = new char[lenght];
    f.seekg(0, ios::beg);
    f.read(buff, lenght);
    f.close();

    int i, op;

    N = get_number(); M = get_number();
    for(i=1; i<=N; ++i)
        V[i] = get_number();

    build();

    while(M--) {
        op = get_number();
        if(op == 0) {
            lo = get_number(); hi = get_number();
            g<<query()<<"\n";
            continue;
        }
        if(op == 1) {
            poz = get_number(); val = get_number();
            update();
            continue;
        }
    }

    g.close();

    return 0;
}