Cod sursa(job #1984523)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 25 mai 2017 02:08:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#define max(a, b) (((a) < (b)) ? (b) : (a))
#define MAX 100000

int n, m, t, x, y;
int arb[3 * MAX];

void update(int pos, int l, int r, int x, int y){
    if(l == r){
        arb[pos] = y;
        return;
    }

    int m = (l + r) / 2;
    if(x <= m)
        update(2 * pos, l, m, x, y);
    else
        update(2 * pos + 1, m + 1, r, x, y);
    arb[pos] = max(arb[2 * pos], arb[2 * pos + 1]);
}

int query(int pos, int l, int r, int s, int d){
    if(s <= l && r <= d)
        return arb[pos];
    if(r < s || d < l)
        return 0;

    int m = (l + r) / 2, x = 0, y = 0;
    if(s <= m)
        x = query(2 * pos, l, m, s, d);
    if(m < d)
        y = query(2 * pos + 1, m + 1, r, s, d);
    return max(x, y);
}

int main(){
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i){
        scanf("%d", &x);
        update(1, 1, n, i, x);
    }

    for(int i = 0; i < m; ++i){
        scanf("%d%d%d", &t, &x, &y);
        if(t == 1)
            update(1, 1, n, x, y);
        else
            printf("%d\n", query(1, 1, n, x, y));
    }
    return 0;
}