Cod sursa(job #2870118)

Utilizator toda.emanuelatoda emanuela toda.emanuela Data 12 martie 2022 09:44:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,x,y,arb[500001],v[100001],indice[100001];

void build(int st,int dr, int poz)
{
    if(st==dr)
    {
        arb[poz]=v[st];
        indice[st]=poz;
        return;
    }
    int mij=(st+dr)/2;
    build(st,mij,2*poz);
    build(mij+1,dr,2*poz+1);
    arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}

int query(int st,int dr, int poz)
{
    if(x<=st&&y>=dr) return arb[poz];
    if(x>dr||y<st) return 0;
    int mij=(st+dr)/2;
    return max(query(st,mij,2*poz),query(mij+1,dr,2*poz+1));
}

void refacere(int poz)
{
    if(poz)
    {
        arb[poz]=max(arb[2*poz],arb[2*poz+1]);
        refacere(poz/2);
    }
}
int main()
{
    int i,cerinta;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];

    build(1,n,1);
    for(i=1;i<=m;i++)
    {
        f>>cerinta>>x>>y;
        if(cerinta==0)
        {
            g<<query(1,n,1)<<'\n';
        }
        else
        {
            arb[indice[x]]=y;
            refacere(indice[x]/2);
        }
    }
    return 0;
}