Cod sursa(job #2074620)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 24 noiembrie 2017 20:14:54
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define max_dim 100002

using namespace std;

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

int A[max_dim], N, M, maximum;

void update(int node, int left, int right, int pos, int value){

    if(left == right){
        A[node] = value;
        return;
    }

    int middle = (left + right) / 2;

    if(pos <= middle)
        update(2 * node, left, middle, pos ,value);
    else
        update(2 * node + 1, middle + 1, right, pos, value);

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

}

void query(int node, int left, int right, int a, int b){

    if(a <= left && b >= right){
        maximum = max(maximum, A[node]);
        return;
    }

    int middle = (left + right) / 2;

    if(a <= middle)
        query(2 * node, left, middle ,a , b);

    if(b > middle)
        query(2 * node + 1, middle + 1, right, a , b);
}

int main(){

    fin >> N >> M;

    for(int i = 1; i <= N; i ++){
        int x;
        fin >> x;
        update(1, 1, N, i, x);
    }

    while(M --){

        int op, a, b;

        fin >> op >> a >> b;

        if(op == 0){
            maximum = -0xFFFFFFFF ;

            query(1, 1, N, a, b);

            fout << maximum << "\n" ;

        }

        if(op == 1){

            update(1, 1, N, a, b);

        }

    }

    return 0;

}