Cod sursa(job #2712516)

Utilizator rARES_4Popa Rares rARES_4 Data 25 februarie 2021 20:54:28
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 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)
        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)
{
    if(st == dr)
    {
        poz_final = max(poz,poz_final);
        arbore[poz] = v[st];
        return;
    }
    update(st,(st+dr)/2,poz*2);
    update((st+dr)/2+1,dr,poz*2+1);
    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);
    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);
        }
    }
}