Cod sursa(job #3327114)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 2 decembrie 2025 12:46:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int NMAX = 100001;

int st[4 * NMAX];

void updateVal(int crtIndex, int left, int right, int &pos, int &val)
{
    if (left == right)
    {
        st[crtIndex] = val;
        return;
    }

    int m = (left + right) >> 1;
    if (pos <= m)
        updateVal(2 * crtIndex, left, m, pos, val);
    else
        updateVal(2 * crtIndex + 1, m + 1, right, pos, val);
    st[crtIndex] = max(st[2 * crtIndex], st[2 * crtIndex + 1]);
}

void queryInterval(int currentPos, int currentLeft, int currentRight, int &queryIntervalLeft, int &queryIntervalRight, int &maxVal)
{
    if (queryIntervalLeft <= currentLeft && currentRight <= queryIntervalRight)
    {
        maxVal = max(maxVal, st[currentPos]);
        return;
    }
    int m = (currentLeft + currentRight) >> 1;
    if (queryIntervalLeft <= m)
        queryInterval(2 * currentPos, currentLeft, m, queryIntervalLeft, queryIntervalRight, maxVal);
    if (m < queryIntervalRight)
        queryInterval(2 * currentPos + 1, m + 1, currentRight, queryIntervalLeft, queryIntervalRight, maxVal);
}

int main()
{
    int a, n, q, b;
    fin >> n >> q;
    for (int i = 1; i <= n; ++i)
    {
        fin >> a;
        updateVal(1, 1, n, i, a);
    }

    while (q--)
    {
        char x;
        fin >> x >> a >> b;
        if (x == '1')
            updateVal(1, 1, n, a, b);
        else
        {
            int maxi = 0;
            queryInterval(1, 1, n, a, b, maxi);
            fout << maxi << "\n";
        }
    }
    return 0;
}