Cod sursa(job #2638396)

Utilizator bogikanagyNagy Boglarka bogikanagy Data 28 iulie 2020 09:27:30
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
//#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

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

vector <int> x;
long long n,i,j,k,a,b,m,t,maxi;
void berak (int bal, int jobb, int gyoker, int poz, int a)
{
    if (bal==jobb)
    {
        x[gyoker]=a;
        return;
    }
    int kozep=(bal+jobb)/2;
    if (poz<=kozep) berak(bal,kozep,2*gyoker,poz,a);
    else berak(kozep+1,jobb,2*gyoker+1,poz,a);

    x[gyoker]=max(x[2*gyoker],x[2*gyoker+1]);
    if (x[2*gyoker]>x[2*gyoker+1]) x[gyoker]=x[2*gyoker];
}

void leker (int bal, int jobb, int gyoker, int a, int b)
{
    if (a<=bal && jobb<= b)
    {
        if (maxi< x[gyoker]) maxi=x[gyoker];
        return;
    }
    int kozep=(jobb+bal)/2;

    if (a<=kozep) leker(bal,kozep,2*gyoker,a,b);
    if (kozep<b) leker(kozep+1,jobb,2*gyoker+1,a,b);

}
int main()
{
    cin>>n>>m;
    x.resize(4*n+1);
    for (i=1;i<=n;++i)
    {
        cin>>a;
        berak(1,n,1,i,a);
    }

    for (j=1;j<=m;++j)
    {
        cin>>t>>a>>b;
        if (t==1)
        {
            berak(1,n,1,a,b);
        }
        else
        {
            maxi=-99999;
            leker(1,n,1,a,b);
            cout<<maxi<<"\n";
        }
    }
    return 0;
}