Cod sursa(job #2701035)

Utilizator proflaurianPanaete Adrian proflaurian Data 29 ianuarie 2021 17:05:11
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,p,st,dr,aint[1<<18],getMax(int,int,int);
int main()
{
    f>>n>>m;
    p=1;
    while(p<n)p*=2;
    for(int i=p,j=1;j<=n;i++,j++)
        f>>aint[i];
    for(int i=p-1;i>=1;i--)
        aint[i]=max(aint[2*i],aint[2*i+1]);
    for(;m;m--)
    {
        int tip;
        f>>tip;
        if(tip==0)
        {
            f>>st>>dr;
            g<<getMax(1,1,p)<<'\n';
        }
        else
        {
            int nod,val;
            f>>nod>>val;
            nod=nod+p-1;
            aint[nod]=val;
            nod/=2;
            while(nod>0)
            {
                aint[nod]=max(aint[2*nod],aint[2*nod+1]);
                nod/=2;
            }

        }
    }
    return 0;
}
int getMax(int nod,int lo,int hi)
{
    if(st<=lo&&hi<=dr)
        return aint[nod];
    if(st>hi||lo>dr)
        return 0;
    int mi=(lo+hi)/2;
    return max(getMax(2*nod,lo,mi),getMax(2*nod+1,mi+1,hi));
}