Cod sursa(job #3331603)

Utilizator Luca_georgescuLuca Georgescu Luca_georgescu Data 29 decembrie 2025 13:07:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax=1e5+5;
const int bsize=320;

int n,q,a[nmax];
int bs,nb,buck_max[bsize];

struct sqrt_decomp
{
    void init_buckets()
    {
        bs=max(1,(int)sqrt(n+1));
        nb=n/bs+1;

        for (int b=0; b<nb; b++ )
            rebuild(b);
    }

    void rebuild(int b)
    {
        int st=b*bs+1;
        int dr=min((b+1)*bs,n);

        int mx=INT_MIN;
        for (int i=st; i<=dr; i++ )
            if ( a[i]>mx )
               mx=a[i];

        buck_max[b]=mx;
    }

    void update(int poz, int val)
    {
        int b=(poz-1)/bs;

        int st=b*bs+1;
        int dr=min((b+1)*bs,n);

        a[poz]=val;
        rebuild(b);
    }

    int get_max(int x, int y)
    {
        int mx=INT_MIN;

        int bl=(x-1)/bs;
        int br=(y-1)/bs;

        if ( bl==br )
        {
            for (int i=x; i<=y; i++ )
                mx=max(mx,a[i]);

            return mx;
        }

        int dr=min((bl+1)*bs,n);
        for (int i=x; i<=dr; i++ )
            mx=max(mx,a[i]);

        for (int i=bl+1; i<=br-1; i++ )
            mx=max(mx,buck_max[i]);

        int st=br*bs+1;
        for (int i=st; i<=y; i++ )
            mx=max(mx,a[i]);

        return mx;
    }

}batog;

int main()
{
    f >> n >> q;
    for (int i=1; i<=n; i++ )
        f >> a[i];

    batog.init_buckets();

    while ( q-- )
    {
        int c,x,y; f >> c >> x >> y;
        if ( c==0 ) g << batog.get_max(x,y) << '\n';
        else batog.update(x,y);
    }

    return 0;
}