Cod sursa(job #2751714)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 15 mai 2021 17:33:02
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

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

int n,m;
int arb[100002];
int A[400002];

void Arb(int poz, int st, int dr)
{
    if(st==dr) //sunt pe frunza
    {
        arb[poz]=A[st];
        return;
    }

    else
    {
        int mijl=(st+dr)/2;
        Arb(poz*2,st,mijl);
        Arb(poz*2+1,mijl+1,dr);

        arb[poz]=max(arb[poz*2], arb[poz*2+1]);
    }

}
int Max(int poz, int pozstart, int pozfinal, int st,int dr)
{
    if(st>=pozstart && pozfinal>=dr) //cu totul in interiorul intervalului
        return arb[poz];

    int mijl=(st+dr)/2;
    int val1=-1,val2=-1;

    if(pozstart<=mijl)
          val1=Max(2*poz, pozstart, pozfinal, st, mijl);
    if(mijl<pozfinal)
          val2=Max(2*poz+1, pozstart, pozfinal, mijl+1, dr);
    return max(val1,val2);



}
void Update(int poznod, int pozupdate,int val, int st, int dr)
{
    if(st==dr)
    {
        arb[poznod]=val;
        return;
    }
    else
    {
        int mijl=(st+dr)/2;
        if(pozupdate<=mijl)
            Update(poznod*2, pozupdate, val, st, mijl);
        else
            Update(poznod*2+1, pozupdate, val, mijl+1, dr);
        arb[poznod]=max(arb[poznod*2], arb[poznod*2+1]);
    }

}

int main()
{
    int task,a,b;
    fin>>n>>m;

    for(int i=1; i<=n; ++i)
        fin>>A[i];

    Arb(1,1,n); //radacina pe pozitia 1

    for(int i=0; i<m; ++i)
    {
        fin>>task>>a>>b;

        if(task==0)
            fout<<Max(1,a,b,1,n)<<"\n";
        else
            Update(1,a,b,1,n);
    }

    return 0;
}