Cod sursa(job #3200313)

Utilizator Teodor94Teodor Plop Teodor94 Data 4 februarie 2024 12:30:03
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
// sursa rebegea stefan

#include <fstream>
#include <vector>

using namespace std;

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

int n,m,sqrn;

int v[100000],batog[1000];

void update(int ind, int aux)
{
    if(aux>=batog[ind/sqrn])
    {
        v[ind]=aux;
        batog[ind/sqrn]=aux;
        return ;
    }
    v[ind]=aux;
    int l=ind/sqrn;
    int r=l+1,bucket=l;
    batog[bucket]=0;
    while(l<r){
        batog[bucket]=max(batog[bucket],v[l++]);
    }
}

int getmax(int l , int r)
{
    int ans=0;
    int nextbuck,prevbuck;
    nextbuck=((l/sqrn)+1)*sqrn;
    prevbuck=(r/sqrn)*sqrn;
    while(l<=r && l<nextbuck)
        ans=max(ans,v[l++]);
    while(r>=l && r>prevbuck)
        ans=max(ans,v[r--]);
    while(nextbuck<=prevbuck)
        ans=max(ans,batog[nextbuck++]);
    return ans;
}

int main()
{
    int n,q;
    cin>>n>>q;
    sqrn=(int)n;
    for(int i=0;i<n;i++)
    {
        cin>>v[i];
        batog[i/sqrn]=max(batog[i/sqrn],v[i]);
    }
    bool tip;
    int a1,a2;
    while(q--)
    {
        cin>>tip>>a1>>a2;
        if(tip)
            update(a1-1,a2);
        else
            cout<<getmax(a1-1,a2-1)<<'\n';
    }
    return 0;
}