Cod sursa(job #1822060)

Utilizator oaspruOctavian Aspru oaspru Data 4 decembrie 2016 10:00:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int n, m, tip, a, b, ans, v[400000];

void query (int nod, int st, int dr)
{
    int mij = (dr+st)/2;
    if (a<=st && b>=dr){
        ans = max (ans, v[nod]);
        return ;
    }
    if (a <= mij){
        query (nod*2, st, mij);
    }
    if (mij < b){
        query (nod*2+1, mij+1, dr);
    }
}

void update (int y, int z)
{
    int x = n+y-1;
    v[x] = z;
    x /= 2;
    while (max(v[x*2], v[x*2+1]) != v[x] && x>0){
        v[x] = max(v[x*2], v[x*2+1]);
        x /= 2;
    }
}

int main ()
{
    freopen ("arbint.in", "r", stdin);
    freopen ("arbint.out", "w", stdout);
    scanf ("%d %d", &n, &m);
    tip = 1;
    while (tip < n){
        tip *= 2;
    }
    for (int i=tip; i<tip+n; i++){
        scanf ("%d", &v[i]);
    }
    n = tip;
    for (int i=n-1; i>0; i--){
        v[i] = max (v[i*2], v[i*2+1]);
    }
    for (int i=1; i<=m; i++){
        scanf ("%d %d %d", &tip, &a, &b);
        if (tip == 0){
            ans = 0;
            query (1, 1, n);
            printf ("%d\n", ans);
        }
        else{
            update (a, b);
        }
    }
    return 0;
}