Cod sursa(job #1350407)

Utilizator IonSebastianIon Sebastian IonSebastian Data 20 februarie 2015 19:45:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>

using namespace std;

FILE *in, *out;

const int N = 1<<18;
int poz, val, a, b, t[N], queried;

int inline maxim(int x, int y){
    return ((x > y) ? x:y);
}

void inline query(int p, int st, int dr){
    if(a<=st && dr<=b){
        queried = t[p];
        return;
    }
    int m = (st+dr)/2, m1 = -N, m2 = -N;
    if(a <= m){
        query(2*p, st, m);
        m1 = queried;
    }
    if(m+1 <= b){
        query(2*p+1, m+1, dr);
        m2 = queried;
    }
    queried = maxim(m1, m2);
}

void inline update(int p, int st, int dr){
    if(st == dr){
         t[p] = val;
         return;
    }
    int m = (st+dr)/2;
    if(poz <= m){
        update(2*p, st, m);
    } else {
        update(2*p+1, m+1, dr);
    }
    t[p] = maxim(t[2*p], t[2*p+1]);
}

int main(){
    in = fopen("arbint.in","r");
    out = fopen("arbint.out", "w");
    int n, m, type, i;
    fscanf(in, "%d %d", &n, &m);
    for(i = 1; i <= n; i++){
        fscanf(in, "%d", &val);
        poz = i;
        update(1, 1, n);
    }
    for(i = 1; i <= m; i++){
        fscanf(in, "%d", &type);
        if(type == 0){
            fscanf(in, "%d %d", &a, &b);
            query(1, 1, n);
            fprintf(out, "%d\n", queried);
        } else {
            fscanf(in, "%d %d", &poz, &val);
            update(1, 1, n);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}