Cod sursa(job #1814840)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 24 noiembrie 2016 16:49:29
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define DIM 20

int N, M, V[DIM], a, b, tip;

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

    scanf("%d %d\n", &N, &M);

    for(int i = 0; i < N; ++i) {
        scanf("%d", &V[i + N]);
    }

    for(int i = N - 1; i > 0; --i) {
        V[i] = max(V[i << 1], V[i << 1 | 1]);
    }

    for(int op = 1; op <= M; ++op) {
        scanf("%d %d %d\n", &tip, &a, &b);
        --a;
        if(tip == 0) {
            int ans = 0;

            for(a += N, b += N; a < b; a >>= 1, b >>= 1) {
                if(a & 1) ans = max(ans, V[a++]);
                if(b & 1) ans = max(ans, V[--b]);
            }

            printf("%d\n", ans);
        }
        else {
            V[a += N] = b;
            for(; a > 0; a >>= 1) {
                V[a >> 1] = max(V[a], V[a ^ 1]);
            }
        }
    }

    return 0;
}