Cod sursa(job #1267871)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 20 noiembrie 2014 13:36:01
Problema Arbori de intervale Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#define MAXN 100000
#define LOGN 17
#define MAXP (1<<(LOGN+1))
int t[MAXP+1];
int a, b, poz, val;
inline int maxim(int a, int b){
    if(a>=b){
        return a;
    }
    return b;
}
int query(int p, int st, int dr){
    int m=(st+dr)/2, m1=0, m2=0;
    if((a<=st)&&(dr<=b)){
        return t[p];
    }
    if(a<=m){
        m1=query(2*p, st, m);
    }
    if(b>m){
        m2=query(2*p+1, m+1, dr);
    }
    return maxim(m1, m2);
}
void update(int p, int st, int dr){
    int m=(st+dr)/2;
    if(st==dr){
        t[p]=val;
        return ;
    }
    if(poz<=m){
        update(2*p, st, m);
    }
    if(poz>m){
        update(2*p+1, m+1, dr);
    }
    t[p]=maxim(t[2*p], t[2*p+1]);
}
int main(){
    int n, q, i, f;
    FILE *fin, *fout;
    fin=fopen("arbint.in", "r");
    fout=fopen("arbint.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    for(i=1; i<=n; i++){
        fscanf(fin, "%d", &val);
        poz=i;
        update(1, 1, n);
    }
    for(i=1; i<=n; i++){
        fscanf(fin, "%d%d%d", &f, &a, &b);
        if(f==0){
            fprintf(fout, "%d\n", query(1, 1, n));
        }else{
            poz=a;
            val=b;
            update(1, 1, n);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}