Cod sursa(job #3157310)

Utilizator Laura139Anghel Laura Laura139 Data 15 octombrie 2023 12:29:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>

using namespace std;

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

int aint[400005], v[100005];

void build(int nod, int st, int dr)
{
    if(st==dr)
    {
        aint[nod]=v[st];
        return;
    }
    int med=(st+dr)/2;
    build(2*nod, st, med);
    build(2*nod+1, med+1, dr);
    aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}

void upd(int nod, int st, int dr, int poz, int val)
{
    if(st==dr)
    {
        aint[nod]=val;
        return;
    }
    int med=(st+dr)/2;
    if(poz<=med)
        upd(2*nod, st, med, poz, val);
    else
        upd(2*nod+1, med+1, dr, poz, val);
    aint[nod]=max(aint[2*nod+1], aint[2*nod]);
}

int qry(int nod, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b)
    {
        return aint[nod];
    }
    int med=(st+dr)/2,maxim=-1;
    if(a<=med)
        maxim=max(qry(2*nod, st, med, a, b),maxim);
    if(b>med)
        maxim=max(qry(2*nod+1, med+1, dr, a, b),maxim);
    return maxim;
}

/*void afisare(int nod, int st, int dr)
{
    if(st==dr)
    {
        cout<<aint[nod]<<" "<<st<<'\n';
        return;
    }
    int med=(st+dr)/2;
    afisare(2*nod, st, med);
    afisare(2*nod+1, med+1, dr);
    cout<<aint[nod]<<" "<<st<<" "<<dr<<'\n';
}*/

int main()
{
    int n,t;
    cin>>n>>t;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    build(1, 1, n);
    for(int i=1;i<=t;i++)
    {
        int a, b, c;
        cin>>c>>a>>b;
        if(c==1)
            upd(1, 1, n, a, b);
        if(c==0)
        {
            cout<<qry(1, 1, n, a, b)<<'\n';
        }
    }
    //afisare(1, 1,n);
    return 0;
}