Cod sursa(job #2953367)

Utilizator proflaurianPanaete Adrian proflaurian Data 11 decembrie 2022 11:00:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
struct nod
{
    int info;
    nod *ST,*DR;
    nod(){info=0;ST=DR=NULL;}
    nod(int info_){info=info_;ST=DR=NULL;}
};
nod *root;
int n,m,a,b,query(nod*,int,int);
nod *construieste(int,int);
void upd(nod*,int,int);
int main ()
{
    f>>n>>m;
    root=construieste(1,n);
    for(;m;m--)
    {
        int tip;
        f>>tip>>a>>b;
        if(tip==0)
            g<<query(root,1,n)<<'\n';
        else
            upd(root,1,n);
    }
    return 0;
}
nod *construieste(int L,int R)
{
    nod *X;
    X=new nod;
    if(L==R)
    {
        int inf;
        f>>inf;
        X->info=inf;
        return X;
    }
    int M=(L+R)/2;
    X->ST=construieste(L,M);
    X->DR=construieste(M+1,R);
    X->info=max(X->ST->info,X->DR->info);
    return X;
}
int query(nod *X,int A,int B)
{
    if(A>b||a>B)
        return 0;
    if(a<=A&&B<=b)
        return X->info;
    int M=(A+B)/2;
    return max(query(X->ST,A,M),query(X->DR,M+1,B));
}

void upd(nod *X,int A,int B)
{
    if(A==B)
    {
        X->info=b;
        return;
    }
    int M=(A+B)/2;
    if(a<=M)upd(X->ST,A,M);
    else upd(X->DR,M+1,B);
    X->info=max(X->ST->info,X->DR->info);
}