Cod sursa(job #2939336)

Utilizator AlexiaPAlexia Papadie AlexiaP Data 13 noiembrie 2022 15:32:08
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 1<<18; /// 2^18 = 1 shiftat de 18 ori spre dreapta
int n,p,q,st,dr,A[N];
int getMax(int nod,int lo,int hi)
{
    if(lo>dr||st>hi)///intervalele nu se intersecteaza
        return 0;
    if(st<=lo&&hi<=dr) /// nodul controleaza [lo,hi] inclus in [st,dr]
        return A[nod];
    int mi=(lo+hi)/2;
    return max(getMax(2*nod,lo,mi),getMax(2*nod+1,mi+1,hi));
}
int main()
{
    f>>n>>q;
    p=1;
    while(p<n)p*=2;
    for(int i=1;i<=n;i++)
        f>>A[p-1+i];
    for(int i=p-1;i>=1;i--)
        A[i]=max(A[2*i],A[2*i+1]);
    for(int i=1;i<=q;i++)
    {
        int tip;
        f>>tip;
        if(tip==0)
        {
            f>>st>>dr;
            g<<getMax(1,1,p)<<'\n';
        }
        else
        {
            int poz,val;
            f>>poz>>val;
            poz=p-1+poz;
            A[poz]=val;
            poz/=2;
            while(poz>=1)
            {
                A[poz]=max(A[2*poz],A[2*poz+1]);
                poz/=2;
            }
        }
    }
    return 0;
}