Cod sursa(job #3275984)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 12 februarie 2025 11:02:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

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

const int SIZE = 100005;
const int SQ_SIZE = 1005;

int n, m, nr_b, block_size;
int a[SIZE], b[SQ_SIZE];

void update(int, int);
int query(int, int);

void read();
void solve();

int main()
{
    read();
    solve();
}

void read()
{
    //citim datele
    fin >> n >> m;
    for(int i = 0; i < n; ++i)
        fin >> a[i];
}

void solve()
{
    //segmentam sirul in blocuri de dim. (int)sqrt(n)
    block_size = (int) sqrt(n);
    nr_b = -1;
    for(int i = 0; i < n; ++i)
    {
        if(i % block_size == 0)
            nr_b++, b[nr_b] = a[i];
        //pastrez in b[] valorile maxime in bucatile de radical
        b[nr_b] = max(b[nr_b], a[i]);
    }

    for(int i = 1; i <= m; ++i)
    {
        int op;
        fin >> op;
        if(op == 1)
        {
            int index, x;
            fin >> index >> x;
            --index;
            update(index, x);
        }
        else
        {
            int st, dr;
            fin >> st >> dr;
            --st;
            --dr;
            fout << query(st, dr) << "\n";
        }
    }
}

void update(int index, int x)
{
    int block_index = index / block_size;
    if(a[index] != b[block_index])
    {
        a[index] = x;
        b[block_index] = max(b[block_index], x);
    }
    else
    {
        int maxi = INT_MIN;
        for(int i = block_index * block_size; i < (block_index + 1) * block_size; ++i)
            if(i != index)
                maxi = max(maxi, a[i]);
        a[index] = x;
        b[block_index] = max(maxi, a[index]);
    }
}

int query(int st, int dr)
{
    int ans = INT_MIN;
    while(st % block_size != 0 && st <= dr)
        ans = max(ans, a[st]), st++;
    while(st + block_size - 1 <= dr)
    {
        int block_index = st / block_size;
        ans = max(ans, b[block_index]);
        st += block_size;
    }
    while(st <= dr)
        ans = max(ans, a[st]), st++;
    return ans;
}