Cod sursa(job #2194826)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 14 aprilie 2018 13:46:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

const int N = 100000;

int a[N], t[N << 1];

int get_id(int l, int r)
{
    return l + r | l != r;
}

void build(int l, int r)
{
    int id = get_id(l, r);
    if (l == r) {
        t[id] = a[l];
    } else {
        int m = l + r >> 1;
        build(l, m);
        build(m + 1, r);
        t[id] = std::max(t[get_id(l, m)], t[get_id(m + 1, r)]);
    }
}

void update(int l, int r, int pos, int val) 
{
    int id = get_id(l, r);
    if (l == r) {
        t[id] = val;
    } else {
        int m = l + r >> 1;
        if (pos <= m) {
            update(l, m, pos, val);
        } else {
            update(m + 1, r, pos, val);
        }
        t[id] = std::max(t[get_id(l, m)], t[get_id(m + 1, r)]); 
    }
}

int eval(int l, int r, int q_l, int q_r) 
{
    int id = get_id(l, r);
    if (q_l <= l && r <= q_r) {
        return t[id];
    } else {
        int m = l + r >> 1;
        int ans = 0;
        if (q_l <= m) {
            ans = std::max(ans, eval(l, m, q_l, q_r));
        }
        if (m < q_r) {
            ans = std::max(ans, eval(m + 1, r, q_l, q_r));
        }
        return ans;
    }
}

int main()
{
    #ifdef INFOARENA
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    #endif
    int n, q;
    scanf("%d%d", &n, &q);
    for (int i = 0; i < n; ++i) {
        scanf("%d", a + i);
    }
    build(0, n - 1);
    
    while (q--> 0) {
        int o, a, b;
        scanf("%d%d%d", &o, &a, &b);
        --a;
        if (o == 0) {
            printf("%d\n", eval(0, n - 1, a, b - 1));
        } else {
            update(0, n - 1, a, b);
        }
    }
}