Cod sursa(job #3342895)

Utilizator GabrielPopescu21Silitra Gabriel - Ilie GabrielPopescu21 Data 26 februarie 2026 01:16:38
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
using namespace std;

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

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

    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 - st) / 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 fin("arbint.in");
    ofstream fout("arbint.out");

    int n, q;
    fin >> n >> q;

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

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

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

    while (q--)
    {
        int c, x, y;
        fin >> c >> x >> y;

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

    return 0;
}