Cod sursa(job #2863268)

Utilizator Undergamerrotariu dragos Undergamer Data 6 martie 2022 15:43:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int heap[400002];
int x,y,n,k;
int maxi;
void update (int nod, int begining, int ending ,int val ,int pos)
{
    if (ending==begining)
    {
        heap[nod]=val;
        return ;
    }
    else
    {
        int mijloc=begining+ending;
        mijloc/=2;      //mijlocul segmentului
        int st=2*nod;   //fiul din stanga
        int dr=st+1;    //fiul din dreapta
        if (pos<=mijloc)
            update (st,begining,mijloc,val,pos);     // parcugem pe fiul din stanga
        else
            update (dr,mijloc+1,ending,val,pos);    //parcugem pe fiul din dreapta
        heap[nod]=max(heap[st],heap[dr]);       //comparam fii
    }
}
void query (int nod,int begining, int ending)
{
    if (x<= begining && y>=ending)
    {
        maxi=max(maxi,heap[nod]);
    }
    else
    {
        int mijloc=(begining+ending)/2; //mijlocul intervalului
        int st=2*nod;                   //fiul din stanga
        int dr=st+1;                    //fiul din dreapta
        if (x<=mijloc)                  //x trece peste fiul din stanga
            query(st,begining,mijloc);  //mergem prin fiul din stanga
        if (y>mijloc)
            query(dr,mijloc+1,ending); //mergem prin fiul din dreapta
    }
}
int main()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        int valoare;
        cin>>valoare;
        update (1,1,n,valoare,i);
    }
    for (int i=1;i<=k;i++)
    {
        int c;
        maxi=0;
        cin>>c>>x>>y;
        if (c==1)
        {
           update (1,1,n,y,x);
        }
        else
        {
            query(1,1,n);
            cout<<maxi<<'\n';
        }
    }
}