Cod sursa(job #1208659)

Utilizator popalexPopescu Alexandru popalex Data 16 iulie 2014 12:28:49
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <algorithm>


#define NMAX 100001

FILE *in, *out;
int N, M, r;
int arbInt[NMAX];

void update(int nod, int st, int dr, int a, int b){

    if ( st == dr ){
        arbInt[nod] = b;

    } else {
        int mid = (st + dr) / 2;
        if (a <= mid)
            update(2 * nod, st, mid, a, b);
        else
            update(2 * nod + 1, mid + 1, dr, a, b);
        arbInt[nod] = std::max(arbInt[2 * nod], arbInt[2 * nod + 1]);
    }

}

void query(int nod, int st, int dr, int a, int b){

    if ( a <= st && dr <= b){
        r = std::max(r, arbInt[nod]);
    } else {
        int mid = (st + dr) / 2;
        if (a <= mid) query(2 * nod, st, mid, a, b);
        if (mid < b)query(2 * nod + 1, mid + 1, dr, a, b);
    }
}


int main(){

    in = fopen("arbint.in", "r");
    out = fopen("arbint.out", "w");

    fscanf(in, "%d%d", &N, &M);

    for(int i = 1; i <= N; i++){
        int a;
        fscanf(in, "%d", &a);
        update(1, 1, N, i, a);
    }


    for(int i = 1; i <= M; i++){
        int a, b, x;
        fscanf(in, "%d%d%d", &x, &a, &b);
        if (x == 0){
            r = 0;
            query(1, 1, N, a, b);
            fprintf(out, "%d\n", r);
        } else if (x == 1){
            update(1, 1, N, a, b);
        }
    }


    fclose(in);
    fclose(out);
    return 0;
}