Cod sursa(job #2886285)

Utilizator dp_flowRadu Radu dp_flow Data 7 aprilie 2022 15:31:35
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define NMax 103

int N, M;
long v[NMax];
long T[4 * NMax];

void build(int l, int r, int index) {
    if(l == r) {
        T[index] = v[l];
        return;
    }

    int mid = (l + r) / 2;
    build(l, mid, 2 * index);
    build(mid + 1, r, 2 * index + 1);

    T[index] = max(T[2 * index], T[2 * index + 1]); 
}

long get(int l, int r, int index, int a, int b) {
    if(l == a && r == b) {
        return T[index];
    }

    int mid = (l + r) / 2;

    if(b <= mid) {
        return get(l, mid, 2 * index, a, b);
    }
    if(a >= mid + 1) {
        return get(mid + 1, r, 2 * index + 1, a, b);
    }

    long l_res = get(l, mid, 2 * index, a, mid);
    long r_res = get(mid + 1, r, 2 * index + 1, mid + 1, b);

    return max(l_res, r_res);
}

void update(int l, int r, int index, int a, int b) {
    if(l == r) {
        T[index] = b;
        return;
    }

    int mid = (l + r) / 2;
    if(a <= mid) {
        update(l, mid, 2 * index, a, b);
        T[index] = max(T[2 * index], T[2 * index + 1]);
        return;
    }
    else {
        update(mid + 1, r, 2 * index + 1, a, b);
        T[index] = max(T[2 * index], T[2 * index + 1]);
        return;
    }
}


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

    scanf("%d %d", &N, &M);
    for(int i = 1; i <= N; i++) {
        scanf("%ld ", &v[i]);
    }

    build(1, N, 1);

    for(int i = 1; i <= M; i++) {
        int task, a, b;
        scanf("%d %d %d", &task, &a, &b);
        if(task == 0) {
            printf("%ld\n", get(1, N, 1, a, b));
        }
        if(task == 1) {
            update(1, N, 1, a, b);
        }
    }

    /*for(int i = 1; i <= 4 * N; i++) {
        printf("%ld ", T[i]);
    }*/

    return 0;
}