Cod sursa(job #2061456)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 9 noiembrie 2017 12:09:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int arbint[400005];

int update(int nod) {
    if(nod > 0) {
        arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
        update(nod / 2);
    }
}

int querry(int st, int dr) {
    int rasp = 0;
    if(st == dr) {
        rasp = arbint[st];
    } else if(st < dr) {
        if(st % 2 == 1) {
            rasp = max(rasp, arbint[st]);
            ++ st;
        }
        if(dr % 2 == 0) {
            rasp = max(rasp, arbint[dr]);
            -- dr;
        }
        rasp = max(rasp, querry(st / 2, dr / 2));
    }
    return rasp;
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    int n, m, ni = 1;
    scanf("%d%d", &n, &m);

    while(ni < n) {
        ni <<= 1;
    }
    -- ni;

    for(int i = 1; i <= n; ++ i) {
        int x;
        scanf("%d", &x);
        arbint[ni + i] = x;
        update((ni + i) / 2);
    }

    for(int i = 1; i <= m; ++ i) {
        int t, a, b;
        scanf("%d%d%d", &t, &a, &b);
        if(t == 1) {
            arbint[ni + a] = b;
            update((ni + a) / 2);
        } else {
            printf("%d\n", querry(ni + a, ni + b));
        }
    }

    return 0;
}