Cod sursa(job #2858627)

Utilizator toda.emanuelatoda emanuela toda.emanuela Data 28 februarie 2022 00:28:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int v[100001],indice[100001],n,m;
int arb[500500];
int i,j,cerinta,a,b;
void construire(int st,int dr,int poz)
{
    if(st==dr)
    {
        arb[poz]=v[st];
        indice[st]=poz;
        return ;
    }
    int mij=(st+dr)/2;
    construire(st,mij,poz*2);
    construire(mij+1,dr,poz*2+1);
    arb[poz]=max(arb[poz*2],arb[poz*2+1]);
}

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

void reactualizare(int poz)///refacem tatii
{
    if(poz)
    {
        arb[poz]=max(arb[poz*2],arb[poz*2+1]);
        reactualizare(poz/2);
    }
}
int main()
{

    f>>n>>m;
    for(i=1;i<=n;i++)
         f>>v[i];
    construire(1,n,1);
    for(i=1;i<=m;i++)
    {
        f>>cerinta>>a>>b;
        if(cerinta==0)
        {
            g<<maxim(1,n,1)<<'\n';
        }
        else
        {
            arb[indice[a]]=b;
            reactualizare(indice[a]/2);
        }
    }
    return 0;
}