Cod sursa(job #3157532)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 15 octombrie 2023 18:07:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

#define NMAX 100005

using namespace std;

void Build(int *T, int *v, int node, int Start, int End) {
    if (Start == End) {
        T[node] = v[Start];
    } else {
        int mid = (Start + End) / 2;

        Build(T, v, 2 * node, Start, mid);
        Build(T, v, 2 * node + 1, mid + 1, End);

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

void Update(int *T, int node, int Start, int End, int Val, int Pos) {
    if (Start == End) {
        T[node] = Val;
    } else {
        int mid = (Start + End) / 2;

        if (Pos <= mid) {
            Update(T, 2 * node, Start, mid, Val, Pos);
        } else {
            Update(T, 2 * node + 1, mid + 1, End, Val, Pos);
        }

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

int Query(int *T, int node, int Start, int End, int L, int R) {
    if (L <= Start && End <= R) {
        return T[node];
    } else {
        int mid = (Start + End) / 2;
        int ans = 0;

        if (L <= mid) {
            ans = max(ans, Query(T, 2 * node, Start, mid, L, R));
        }

        if (R > mid) {
            ans = max(ans, Query(T, 2 * node + 1, mid + 1, End, L, R));
        }

        return ans;
    }
}

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

    int N, Q;
    int v[NMAX] = {};
    int T[4 * NMAX] = {};

    scanf("%d%d", &N, &Q);

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

    Build(T, v, 1, 1, N);

    for (int i = 1; i <= Q; i++) {
        int type, x, y;
        cin >> type >> x >> y;

        if (type == 1) {
            Update(T, 1, 1, N, y, x);
        } else {
            printf("%d\n", Query(T, 1, 1, N, x, y));
        }
    }

    return 0;
}