Cod sursa(job #3033259)

Utilizator Robilika2007Robert Badea Robilika2007 Data 23 martie 2023 17:36:43
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;

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

#define MAX_N 100000
const int sqrt_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + sqrt_N - 1) / sqrt_N;

int v[MAX_N];
int batog[BATOG_SIZE];

void update(int poz, int val)
{
    v[poz] = val;

    int interval = poz / sqrt_N;
    int pozB = interval * sqrt_N;

    batog[interval] = 0;
    for(int i = pozB; i < pozB + sqrt_N; ++i)
        batog[interval] = max(batog[interval], v[i]);
}

int query(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++]);
    }

    return ans;
}


int main()
{
    int n, m, c, a, b;
    in >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        in >> a;
        update(i, a);
    }
    for(int i = 0; i < m; ++i)
    {
        in >> c >> a >> b;
        if(c == 0)
        {
            out << query(a,b) << '\n';
        } else
        {
            update(a,b);
        }
    }
    return 0;
}