Cod sursa(job #1277690)

Utilizator evodaniVasile Daniel evodani Data 27 noiembrie 2014 23:48:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define NMAX 300005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int arb[NMAX];

void update (int nod, int poz, int val, int st, int dr) {
    int m;
    if (st==dr) arb[nod]=val;
    else {
        m=(st+dr)/2;
        if (poz<=m) update(2*nod, poz, val, st, m);
        else update (2*nod+1, poz, val, m+1, dr);
        arb[nod]=max(arb[2*nod], arb[2*nod+1]);
    }
}

int query (int nod, int st, int dr, int a, int b) {
    int x=-1, y=-1, mij;
    if (st>=a && dr<=b) return arb[nod];
    else {
        mij=(st+dr)/2;
        if (mij>=a) x=query(2*nod, st, mij, a, b);
        if (mij+1<=b) y=query(2*nod+1, mij+1, dr, a, b);
        return max(x, y);
    }
}

int main() {
    int n, m, i, val, tip, poz, st, dr;

    fin>>n>>m;
    /*for (i=1; i<=n; ++i) {
        arb[i]=-1;
    }*/
    for (i=1; i<=n; ++i) {
        fin>>val;
        update (1, i, val, 1, n);
    }
    for (i=1; i<=m; ++i) {
        fin>>tip;
        if (tip==1) { //update
            fin>>poz>>val;
            update (1, poz, val, 1, n);
        }
        else { //query
            fin>>st>>dr;
            fout<<query (1, 1, n, st, dr)<<'\n';
        }
    }
    fout.close();
    return 0;
}