Cod sursa(job #2715789)

Utilizator rARES_4Popa Rares rARES_4 Data 4 martie 2021 11:02:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
/// memoria se declara 4 * n
int arbore[400001];
int v[100001];
int n,q,poz_final,mx_rasp;
void gasire_mx(int st_arb,int dr_arb,int st,int dr,int poz)
{
    /// daca intervalul din arbore e inclus in intervalul cautat
    int mij = (st_arb+dr_arb)/2;
    if(st_arb >=st && dr_arb<=dr)
    {
        mx_rasp = max(arbore[poz],mx_rasp);
        return;
    }
    if(st_arb == dr_arb)
        {
            mx_rasp = max(arbore[poz],mx_rasp);
            return;
        }
    if(st<=mij)
    {
        gasire_mx(st_arb,mij,st,dr,poz*2);
    }
    if(mij<dr)
    {
        gasire_mx(mij+1,dr_arb,st,dr,poz*2+1);
    }
}
void update(int st,int dr,int poz,int poz_nr)
{
    int mij = (st+dr)/2;
    if(st == dr)
    {
        poz_final = max(poz,poz_final);
        arbore[poz] = v[poz_nr];
        return;
    }
    if(poz_nr<=mij)
        update(st,mij,poz*2,poz_nr);
    else
    {
        update(mij+1,dr,poz*2+1,poz_nr);
    }
    arbore[poz] = max(arbore[poz*2],arbore[poz*2+1]);

}
int main()
{
    f >> n >> q;
    for(int i = 1; i<=n; i++)
    {
        f >> v[i];
        update(1,n,1,i);
    }
    int st,dr,c;
    for(int i = 1; i<=q; i++)
    {

        f >> c>>st >> dr;
        if(c == 0)
        {
            mx_rasp = 0;
            gasire_mx(1,n,st,dr,1);
            g << mx_rasp <<'\n';
        }
        else
        {
            v[st] = dr;
            update(1,n,1,st);
        }
    }
}