Cod sursa(job #3344461)

Utilizator GabrielPopescu21Silitra Gabriel - Ilie GabrielPopescu21 Data 2 martie 2026 00:03:56
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX = 100005;
int aint[4*MAX], p;

void update(int pos, int val)
{
    pos += (p-1);
    aint[pos] = val;

    while (pos > 1)
    {
        pos /= 2;
        aint[pos] = max(aint[pos*2], aint[pos*2+1]);
    }
}

int query(int k, int x, int y, int st, int dr)
{
    if (x == st && y == dr)
        return aint[k];

    int mij = (st + dr) / 2;
    if (y <= mij)
        return query(2*k, x, y, st, mij);

    if (x >= mij+1)
        return query(2*k+1, x, y, mij+1, dr);

    return max(query(2*k, x, mij, st, mij), query(2*k+1, mij+1, y, mij+1, dr));
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n, m;
    cin >> n >> m;

    for (p = 1; p < n; p *= 2);

    for (int i = 1; i <= n; ++i)
        cin >> aint[p+i-1];

    for (int i = n-1; i >= 1; --i)
        aint[i] = max(aint[2*i], aint[2*i+1]);

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

        if (c == 0)
            cout << query(1, x, y, 1, p) << "\n";
        else
            update(x, y);
    }

    return 0;
}