Cod sursa(job #2953630)

Utilizator stefR2020StefanRadulescu stefR2020 Data 11 decembrie 2022 20:26:55
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#define NMAX 200005
#define int long long

using namespace std;

int arbordeiaurt[4*NMAX];

int adunarequirky(int a, int b)
{
    return max(a,b);
}

void apdaterecursiv(int x,int poz,int st,int dr,int clashroyale)
{
    if(st==dr)
    {
        arbordeiaurt[clashroyale]=x;
        return;
    }
    int midraudetot=st+dr;
    midraudetot/=2;
    if(poz<=midraudetot)
        apdaterecursiv(x,poz,st,midraudetot,2*clashroyale);
    else
        apdaterecursiv(x,poz,midraudetot+1,dr,1+2*clashroyale);
    arbordeiaurt[clashroyale]=adunarequirky(arbordeiaurt[2*clashroyale], arbordeiaurt[1+2*clashroyale]);
}

int intrebareintrebatoare(int qst, int qdr, int st, int dr, int clashroyale)
{
    if(st==qst && dr==qdr) return arbordeiaurt[clashroyale];
    int midraudetot=st+dr;
    midraudetot/=2;
    if(qdr<=midraudetot)
        return intrebareintrebatoare(qst,qdr,st,midraudetot,2*clashroyale);
    if(qst>midraudetot)
        return intrebareintrebatoare(qst,qdr,midraudetot+1,dr,2*clashroyale+1);
    return adunarequirky(intrebareintrebatoare(qst,midraudetot,st,midraudetot,2*clashroyale),intrebareintrebatoare(midraudetot+1,qdr,midraudetot+1,dr,2*clashroyale+1));
}

int32_t main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        apdaterecursiv(x,i,1,n,1);
    }
    for(int i=0;i<q;i++)
    {
        int cer;
        cin>>cer;
        if(cer==1)
        {
            int poz,x;
            cin>>poz>>x;
            apdaterecursiv(x,poz,1,n,1);
        }
        else
        {
            int st,dr;
            cin>>st>>dr;
            cout<<intrebareintrebatoare(st,dr,1,n,1)<<'\n';
        }
    }
    return 0;
}