Cod sursa(job #2869223)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 11 martie 2022 13:19:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <algorithm>
#include <cstdio>

#define MaxN 100005

using namespace std;

int n, m, v[MaxN], t[3 * MaxN], val, pos, Start, End;

void Build(int node, int s, int e) {
    if (s == e) {
        t[node] = v[s];
    } else {
        int mid = (s + e) / 2;
        Build(2 * node, s, mid);
        Build(2 * node + 1, mid + 1, e);
        t[node] = max(t[2 * node], t[2 * node + 1]);
    }
}

void Update(int node, int s, int e) {
    if (s == e) {
        t[node] = val;
    } else {
        int mid = (s + e) / 2;
        if (pos <= mid)
            Update(2 * node, s, mid);
        else
            Update(2 * node + 1, mid + 1, e);
        t[node] = max(t[2 * node], t[2 * node + 1]);
    }
}

void Query(int node, int s, int e) {
    if (Start <= s && e <= End) {
        val = max(val, t[node]);
    } else {
        int mid = (s + e) / 2;
        if (Start <= mid)
            Query(2 * node, s, mid);
        if (End > mid)
            Query(2 * node + 1, mid + 1, e);
    }
}

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("%d", &v[i]);
    }

    Build(1, 1, n);

    for (int i = 1; i <= m; i++) {
        int tip, a, b;
        scanf("%d%d%d", &tip, &a, &b);
        if (tip == 0) {
            Start = a;
            End = b;
            val = 0;
            Query(1, 1, n);
            printf("%d\n", val);
        } else {
            pos = a;
            val = b;
            Update(1, 1, n);
        }
    }

    return 0;
}