Cod sursa(job #2816634)

Utilizator stefandutastefandutahoria stefanduta Data 11 decembrie 2021 19:57:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#define NMAX 100005

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

int n, m, i, j, op, a, b;
int v[NMAX];
int batog[350];
const int sq = 320;

void update(int i, int x)
{
    if (batog[i / sq] <= x)
    {
        batog[i / sq] = x;
        v[i] = x;
    }
    else if (batog[i / sq] > x)
    {
        v[i] = x;
        batog[i / sq] = -1;
        for (int j = i / sq * sq; j < i / sq * sq + sq; ++j)
        {
            batog[i / sq] = max(batog[i / sq], v[j]);
        }
    }
}

int query(int a, int b)
{
    int maxx = -1;
    int pozfirstinterval = (a + sq - 1) / sq * sq;
    int pozlastinterval = b / sq * sq;

    while (a <= b &&  a < pozfirstinterval)
    {
        maxx = max(maxx, v[a++]);
    }
    while (b >= a && b >= pozlastinterval)
    {
        maxx = max(maxx, v[b--]);
    }

    pozfirstinterval = pozfirstinterval / sq;
    pozlastinterval = pozlastinterval / sq;

    while (pozfirstinterval < pozlastinterval)
        maxx = max(maxx, batog[pozfirstinterval++]);

    return maxx;
}

int main()
{
    in >> n >> m;
    for (i = 1; i <= n; ++i)
    {
        in >> v[i];
    }
    for (i = 0; i < n; ++i)
    {
        batog[i / sq] = max(batog[i / sq], v[i + 1]);
    }
    for (j = 1; j <= m; ++j)
    {
        in >> op >> a >> b;
        if (op == 1)
        {
            update(a, b);
        }
        else
        {
            out << query(a, b) << '\n';
        }
    }
    return 0;
}