Cod sursa(job #1902285)

Utilizator Master011Dragos Martac Master011 Data 4 martie 2017 14:57:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<cstdio>
using namespace std;

const int nMax = 100000;
int t[nMax * 2], n, m;

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

void build(){
    for(int i = n - 1 ; i >= 0 ; --i){
        t[i] = maxim(t[i * 2], t[i * 2 + 1]);
    }
}

void modify(int p, int val){
    for(t[p] = val; p > 1 ; p /= 2) t[p / 2] = maxim(t[p], t[p^1]);
}

int query(int l, int r){
    int rasp = t[l];
    for(;l <= r; l /= 2, r /= 2){
        if(l&1) rasp = maxim(rasp, t[l++]);
        if(!(r&1)) rasp = maxim(rasp, t[r--]);
    }
    return rasp;
}

int main (){
    FILE *in = fopen("arbint.in","r");
    FILE *out = fopen("arbint.out","w");

    fscanf(in,"%d%d", &n, &m);

    for(int i = 0 ; i < n ; ++i){
        fscanf(in,"%d", t + i + n);
    }

    build();

    int tip, a, b;
    for(int i = 0 ; i < m ; ++i){
        fscanf(in,"%d%d%d", &tip, &a, &b);
        if(tip)
            modify(a + n - 1, b);
        else
            fprintf(out,"%d\n", query(a + n - 1, b + n - 1));
    }
}