Cod sursa(job #3159658)

Utilizator teodora_lauraTeodora teodora_laura Data 21 octombrie 2023 19:10:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

const int N=100005;
int a[N], arbore[4*N];
int n, m;

void build1(int nod, int st, int dr)
{
    if(st==dr)
    {
        arbore[nod]=a[st];
    }else
    {
        int mij=(st+dr)/2;
        build1(nod*2, st, mij);
        build1(nod*2+1, mij+1, dr);
        arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
    }
}
void update(int nod, int st, int dr, int poz, int val)
{
    if(st==dr)
    {
        arbore[nod]=val;
    }
    else
    {
        int mij=(st+dr)/2;
        if(poz<=mij)
            update(nod*2, st, mij, poz, val);
        else
            update(nod*2+1, mij+1, dr, poz, val);
        arbore[nod]=max(arbore[nod*2], arbore[nod*2+1]);
    }
}
int query(int nod, int st, int dr, int qst, int qdr)
{
    if(qst<=st&&qdr>=dr)
        return arbore[nod];
    else
    {
        int mij=(st+dr)/2;
        if(qdr<=mij)
            return query(nod*2, st, mij, qst, qdr);
        if(mij+1<=qst)
            return query(nod*2+1, mij+1, dr, qst, qdr);
        return max(query(nod*2, st, mij, qst, qdr),query(nod*2+1, mij+1, dr, qst, qdr));
    }
}
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
        f>>a[i];
    build1(1, 1, n);

    g<<endl;
    while(m--)
    {
        int t;
        f>>t;
        if(t==1)
        {
            int poz, val;
            f>>poz>>val;
            update(1,1,n,poz, val);
        }
        else
        {
            int st, dr;
            f>>st>>dr;
            g<<query(1,1,n,st, dr)<<endl;
        }
    }
    return 0;
}