Cod sursa(job #3340451)

Utilizator alexkAlexandru Kelemen alexk Data 14 februarie 2026 13:19:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int Nmax=100000;
int N, M, Max;
int v[Nmax+5], AINT[4*Nmax+5];

void Read()
{
    cin>>N>>M;
    for(int i=1;i<=N;i++)
    {
        cin>>v[i];
    }
}

void Update(int i, int Left, int Right, int a, int b)
{
    if(Left==Right)
    {
        AINT[i]=b;
        return;
    }
    int Mid=(Left+Right)/2;
    if(a<=Mid)
        Update(2*i, Left, Mid, a, b);
    else
        Update(2*i+1, Mid+1, Right, a, b);
    AINT[i]=max(AINT[2*i], AINT[2*i+1]);
}

void Build()
{
    for(int i=1;i<=N;i++)
        Update(1, 1, N, i, v[i]);
}

void Query(int i, int Left, int Right, int a, int b)
{
    if(a<=Left && Right<=b)
    {
        Max=max(Max, AINT[i]);
        return;
    }
    if(a>Right || b<Left)
        return;
    int Mid=(Left+Right)/2;
    Query(2*i, Left, Mid, a, b);
    Query(2*i+1, Mid+1, Right, a, b);
}

void Solve()
{
    for(int i=1;i<=M;i++)
    {
        int op, a, b;
        cin>>op>>a>>b;
        if(op==1)
            Update(1, 1, N, a, b);
        else
        {
            Max=-1;
            Query(1, 1, N, a, b);
            cout<<Max<<'\n';
        }

    }
}

int main()
{
    Read();
    Build();
    Solve();

    return 0;
}