Cod sursa(job #1700098)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 9 mai 2016 14:54:07
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000

int v[MAXN+1];
int aint[4*MAXN+5];

inline max(int a, int b){
    return a > b ? a : b;
}

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

int left, right;
int rez;
void query(int p, int st, int dr){
    if(st>=left && dr<=right)
        rez=max(rez, aint[p]);
    else{
        int m=(st+dr)/2;
        if(left<=m)
            query(2*p, st, m);
        if(right>m)
            query(2*p+1, m+1, dr);
    }
}

int main(){
    int n, m;
    FILE*fi,*fo;
    fi=fopen("arbint.in","r");
    fo=fopen("arbint.out","w");
    fscanf(fi,"%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        fscanf(fi,"%d", &v[i]);
        poz=i;
        val=v[i];
        update(1, 1, n);
    }
    for(int i=1;i<=m;i++){
        int c, a, b;
        fscanf(fi,"%d%d%d", &c, &a, &b);
        if(c==0){
            left=a;
            right=b;
            rez=0;
            query(1, 1, n);
            fprintf(fo,"%d\n", rez);
        }
        else{
            poz=a;
            val=b;
            update(1, 1, n);
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}