Cod sursa(job #3286848)

Utilizator CimpoesuFabianCimpoesu Fabian George CimpoesuFabian Data 14 martie 2025 18:53:00
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, k, aint[400001], m, op;

void Update(int p, int x)
{
    p += (n - 1);
    aint[p] = x;
    while (p > 1)
    {
        p /= 2;
        aint[p] = max(aint[2*p], aint[2*p + 1]);
    }
}

int Query(int k, int x, int y, int st, int dr)
{
    int m;
    if (st == x && y == dr)
        return aint[k];
    m = (st + dr) / 2;
    if (y <= m)
        return Query(2*k, x, y, st, m);
    if (m + 1 <= x)
        return Query(2*k+1, x, y, m + 1, dr);
    return max(Query(2*k, x, m, st, m), Query(2*k+1, m + 1, y, m + 1, dr));
}

int main()
{
    int i, a, b;
    fin >> k >> m;
    for (n = 1 ; n < k ; n *= 2)
        ;
    for (i = 1 ; i <= k ; i++)
        fin >> aint[n - 1 + i];
    for (i = n - 1 ; i >= 1 ; i--)
        aint[i] = max(aint[2*i], aint[2*i + 1]);
    for (i = 1 ; i <= m ; i++)
    {
        fin >> op >> a >> b;
        if (op == 1)
            Update(a, b);
        else
            fout << Query(1, a, b, 1, n) << "\n";
    }
    return 0;
}