Cod sursa(job #3200324)

Utilizator ReBeGhElRebegea Stefan ReBeGhEl Data 4 februarie 2024 12:40:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

int n,m,sqrn;

vector < int > v,batog;

void update(int ind, int aux)
{
    v[ind]=aux;
    int l=(ind/sqrn)*sqrn,bucket=ind/sqrn;
    int r=l+sqrn;
    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-1;
    //cout<<l<<" "<<r<<" ";
    while(l<=r && l<nextbuck)
        ans=max(ans,v[l++]);
    while(r>=l && r>prevbuck)
        ans=max(ans,v[r--]);
    int st=nextbuck/sqrn,dr=prevbuck/sqrn;
    while(st<=dr)
        ans=max(ans,batog[st++]);
    return ans;
}

int main()
{
    int n,q;
    cin>>n>>q;
    sqrn=(int)sqrt(n);
    batog.resize(sqrn+5);
    v.resize(n);
    for(int i=0;i<n;i++)
    {
        cin>>v[i];
        int aux=i/sqrn;
        batog[aux]=max(batog[aux],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;
}