Cod sursa(job #2478585)

Utilizator andrei42Oandrei42O andrei42O Data 22 octombrie 2019 13:54:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct nod
{
    int info;
    nod *fs,*fd,*ta;
};
const int N = 100010;
int n,m,L,R,cod,getMax(nod*,int,int);
nod *builtAint(nod*,int,int);
nod *root, *F[N];
int main()
{
    f>>n>>m;
    root=builtAint(NULL,1,n);
    for(;m;m--)
    {
        f>>cod>>L>>R;
        if(cod)
        {
            F[L]->info=R;
            for(nod *aux=F[L]->ta;aux;aux=aux->ta)
                aux->info=max(aux->fs->info,aux->fd->info);
        }
        else
            g<<getMax(root,1,n)<<'\n';
    }
    return 0;
}

nod *builtAint(nod* tata,int st,int dr)
{
    nod *aux=new nod;
    aux->ta=tata;
    if(st==dr)
    {
        int x;
        f>>x;
        aux->info=x;
        aux->fs=aux->fd=NULL;
        F[st]=aux;
        return aux;
    }
    int mi=(st+dr)/2;
    aux->fs=builtAint(aux,st,mi);
    aux->fd=builtAint(aux,mi+1,dr);
    aux->info=max(aux->fs->info,aux->fd->info);
    return aux;
}
int getMax(nod *r,int st,int dr)
{
    if(L<=st&&dr<=R)
        return r->info;
    if(L>dr||st>R)
        return 0;
    int mi=(st+dr)/2;
    return max(getMax(r->fs,st,mi),getMax(r->fd,mi+1,dr));
}