Cod sursa(job #3364784)

Utilizator daviddxmqStan David Andrei daviddxmq Data 11 septembrie 2026 12:06:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int MAXN = 100005;

int arr[MAXN];
int n, m;
int maxInt[1005];
int lenGrup;

void update(int a, int b) {
    int interval = (a - 1) / lenGrup;
    int vechi = arr[a];
    arr[a] = b;

    if (b > maxInt[interval])
        maxInt[interval] = b;

    else if (vechi == maxInt[interval] && b < vechi) {
        int st = interval * lenGrup + 1;
        int dr = min(n, (interval + 1) * lenGrup);

        maxInt[interval] = 0;
        for (int i = st; i <= dr; ++i)
            maxInt[interval] = max(maxInt[interval], arr[i]);
    }
}

int query(int a, int b) {
    int maxim = 0;
    int intervalA = (a - 1) / lenGrup;
    int intervalB = (b - 1) / lenGrup;

    if (intervalA == intervalB) {
        for (int i = a; i <= b; ++i)
            maxim = max(maxim, arr[i]);
        return maxim;
    }

    int endGrupA = (intervalA + 1) * lenGrup;
    int startGrupB = intervalB * lenGrup + 1;

    for (int i = a; i <= endGrupA; ++i)
        maxim = max(maxim, arr[i]);

    for (int i = intervalA + 1; i < intervalB; ++i)
        maxim = max(maxim, maxInt[i]);

    for (int i = startGrupB; i <= b; ++i)
        maxim = max(maxim, arr[i]);

    return maxim;
}

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

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m;
    lenGrup = sqrt(n);

    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        int interval = (i - 1) / lenGrup;
        maxInt[interval] = max(maxInt[interval], arr[i]);
    }

    for (int i = 1; i <= m; ++i) {
        int op, a, b;
        cin >> op >> a >> b;
        if (op == 0)
            cout << query(a, b) << "\n";
        else
            update(a, b);
    }

    return 0;
}