Cod sursa(job #1162732)

Utilizator SRaduRadu Szasz SRadu Data 31 martie 2014 22:27:08
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>

using namespace std;

const int MAX = 100010;

int N, M;
int V[MAX], aInt[MAX << 2]; 

#define leftSon (nod << 1)
#define rightSon ((nod << 1) | 1)

void Update(int nod, int L, int R, int poz, int el) {
    if(L == R) {
        aInt[nod] = el;
        return;
    } int M = (L + R) >> 1;
    if(poz <= M) 
        Update(leftSon, L, M, poz, el);
    else 
        Update(rightSon, M + 1, R, poz, el);

    aInt[nod] = max(aInt[leftSon], aInt[rightSon]);
}

int Query(int nod, int L, int R, int Left, int Right) {
    if(Left <= L && R <= Right) {
        return aInt[nod];
    } int M = (L + R) >> 1;
    int Ans = 0;
    if(Left <= M) 
        Ans = max(Ans, Query(leftSon, L, M, Left, Right));
    if(M < Right)
        Ans = max(Ans, Query(rightSon, M + 1, R, Left, Right));
    return Ans; 
}

void BuildAInt(int nod, int L, int R) {
    if(L == R) {
        aInt[nod] = V[L];
        return;
    } int M = (L + R) >> 1;
    BuildAInt(leftSon, L, M);
    BuildAInt(rightSon, M + 1, R);

    aInt[nod] = max(aInt[leftSon], aInt[rightSon]);
}

int main() {
    ifstream in("arbint.in"); ofstream out("arbint.out");
    in >> N >> M;
    for(int i = 1; i <= N; i++) {
        in >> V[i];
    }
    BuildAInt(1, 1, N);
    for(int i = 1, op, A, B; i <= M; i++) {
        in >> op >> A >> B;
        if(!op) 
            out << Query(1, 1, N, A, B) << "\n";
        else 
            Update(1, 1, N, A, B);
    }
}