Cod sursa(job #3033241)

Utilizator Robilika2007Robert Badea Robilika2007 Data 23 martie 2023 17:11:02
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <iostream>

using namespace std;

#define MAX_N 100001
#define sqrt_N 317
int v[MAX_N];
int batog[sqrt_N];

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

void update(int poz, int val)
{
    int pozB = poz / sqrt_N;
    batog[pozB] = max(batog[pozB], val);
    if(batog[pozB] == v[poz])
    {
        for(int i = (pozB - 1) * sqrt_N; i <= pozB * sqrt_N; ++i)
            batog[pozB] = max(batog[pozB], v[i]);
    }

    v[poz] = val;
}

void querry(int st, int dr)
{
    int firstBucket = (st + sqrt_N - 1) / sqrt_N * sqrt_N;
    int lastBucket = dr / sqrt_N * sqrt_N;

    int ans = 0;

    while (st <= dr && st < firstBucket)
        ans = max(v[st++], ans);

    while (dr >= st && dr >= lastBucket)
        ans = max(v[dr--], ans);

    firstBucket /= sqrt_N;
    lastBucket /= sqrt_N;

    while(firstBucket < lastBucket)
    {
        ans = max(ans, batog[firstBucket++]);
    }

    out << ans << '\n';
}

int main()
{
    int n, m, c, a, b;
    in >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        in >> v[i];
        batog[i / sqrt_N] = max(batog[i / sqrt_N], v[i]);
    }
    for(int i = 0; i < m; ++i)
    {
        in >> c >> a >> b;
        if(c == 0)
        {
            querry(a,b);
        } else
        {
            update(a,b);
        }
    }
    return 0;
}