Cod sursa(job #3181663)

Utilizator brianabucur11Briana Bucur brianabucur11 Data 7 decembrie 2023 17:18:57
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int n, m, v[15005], t[70005];

void read ()
{
    fin.tie(nullptr);
    fout.tie(nullptr);
    fin >> n >> m;
    for (int i=1; i<=n; i++)
        fin >> v[i];
}

void init (const int &nod, const int &a, const int &b)
{
    if (a==b)
    {
        t[nod]=v[a];
        return;
    }
    else
    {
        init(2*nod,a,(a+b)/2);
        init(2*nod+1,(a+b)/2+1,b);
        t[nod]=max(t[nod*2],t[nod*2+1]);
        return;
    }
}

void update (const int &nod, const int &a, const int &b, const int &poz, const int &val)
{
    if (a==b)
    {
        v[poz]=val;
        t[nod]=val;
        return;
    }
    else
    {
        int mij=(a+b)/2;
        if (mij<poz)
            update(2*nod+1,mij+1,b,poz,val);
        else
            update(2*nod,a,mij,poz,val);
        t[nod]=max(t[2*nod],t[2*nod+1]);
        return;
    }
}

int query (const int &nod, const int &a, const int &b, const int &p, const int &q)
{
    if (a>=p && b<=q)
        return t[nod];
    else
    {
        int cl=0, cr=0;
        int mij=(a+b)/2;
        if (mij>=p)
            cl=query(2*nod,a,mij,p,q);
        if ((mij+1)<=q)
            cr=query(2*nod+1,mij+1,b,p,q);
        return max(cl,cr);
    }
}

void solve ()
{
    int x, p, q;
    for (int i=1; i<=m; i++)
    {
        fin >> x >> p >> q;
        if (x==1)
            update(1,1,n,p,q);
        else
            fout << query(1,1,n,p,q) << '\n';
    }
}

int main()
{
    read();
    init(1,1,n);
    solve();
    return 0;
}