Cod sursa(job #1330175)

Utilizator mariusn01Marius Nicoli mariusn01 Data 30 ianuarie 2015 14:38:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>

using namespace std;

int A[400010], v[100010], n, m, i, op, a, b, p, x, maxim;

void build(int nod, int st, int dr) {
    if (st == dr){
        A[nod] = v[st];
        return;
    }

    int mid = (st + dr)/2;
    build(2*nod, st, mid);
    build(2*nod + 1, mid + 1, dr);
    A[nod] = max(A[2*nod], A[2*nod+1]);

}

void update(int nod, int st, int dr, int p, int x) {
    if (st == dr) { // ==p
        A[nod] = x;
        return;
    }

    int mid = (st + dr)/2;
    if (p<=mid)
        update(2*nod, st, mid, p, x);
    if (p>mid)
        update(2*nod+1, mid+1, dr, p, x);

    A[nod] = max(A[2*nod], A[2*nod+1]);

}

void query(int nod, int st, int dr, int a, int b) {
    if (a <= st && dr <= b) {
        maxim = max(maxim, A[nod]);
        return;
    }
    int mid = (st + dr)/2;
    if (a <= mid)
        query(2*nod, st, mid, a, b);
    if (b > mid)
        query(2*nod+1, mid+1, dr, a, b);
}


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

    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];


    build(1, 1, n);

    for (i=1;i<=m;i++) {
        fin>>op;
        if (op == 0) {
            fin>>a>>b;
            maxim = 0;
            query(1, 1, n, a, b);
            fout<<maxim<<"\n";
        } else {
            fin>>a>>b;
            update(1, 1, n, a, b);

        }

    }
    return 0;
}