Cod sursa(job #3143224)

Utilizator proflaurianPanaete Adrian proflaurian Data 28 iulie 2023 11:23:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N = 270000;
int n,p,q,t,x,y,a[N];
int getMax(int nod,int st,int dr)
{
    /// interval controlat de nod [st,dr]
    /// interval chestionat [x,y]
    if( x <=st && dr <= y) /// cazul cand [st,dr] inclus in [x,y]
        return a[nod]; /// ma intereseaza maximul de pe tot intervalul [st,dr] -> a[nod]
    if( y < st || dr < x ) /// cazul cand [st,dr] si [x,y] sunt disjuncte
        return 0; /// nu ma intereseaza nimic din intervalul [st,dr]
    int mi=(st+dr)/2;
    return max(getMax(2*nod,st,mi),getMax(2*nod+1,mi+1,dr));
}
void updMax(int nod,int val)
{
    a[nod]=val;///modificam valoarea la ultimul nivel
    nod/=2;/// ne mutam pe nivelul tatalui
    while(nod)/// se parcurge lantul de la tata pana la radacina
    {
        a[nod]=max(a[2*nod],a[2*nod+1]);///recalculam valoarea din nod
        nod/=2;///ne mutam la tata
    }
}
int main()
{
    f>>n>>q;
    p=1;
    while(p<n)p*=2;
    for(int i=1;i<=n;i++)
        f>>a[i+p-1];
    for(int i=p-1;i>=1;i--)
        a[i]=max(a[2*i],a[2*i+1]);
    for(;q;q--) /// acest for va face exact q repetitii
    {
        f>>t>>x>>y;
        if(t==0)
            g<<getMax(1,1,p)<<'\n';
        else
            updMax(x+p-1,y);
    }
    return 0;
}