Cod sursa(job #2558998)

Utilizator TzigCurta Tudor Tzig Data 26 februarie 2020 21:56:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int NMAX = 100005;

int N,M;
int St[4*NMAX],Dr[4*NMAX],Maxim[4*NMAX];
int Indice[NMAX];

void Build(int nod,int st,int dr)
{
    St[nod]=st;
    Dr[nod]=dr;
    if(st==dr){
        f>>Maxim[nod];
        Indice[st]=nod;
        return;
    }
    int mij=(st+dr)/2;
    Build(2*nod,st,mij);
    Build(2*nod+1,mij+1,dr);
    Maxim[nod]=max(Maxim[2*nod],Maxim[2*nod+1]);
}

int Cauta_Maxim(int nod,int st,int dr)
{
    if(St[nod]>dr || Dr[nod]<st){
        return -1;
    }
    if(st<=St[nod] && Dr[nod]<=dr){
        return Maxim[nod];
    }
    int r1=Cauta_Maxim(2*nod,st,dr);
    int r2=Cauta_Maxim(2*nod+1,st,dr);
    return max(r1,r2);
}

void Configure(int nod)
{
    int tata=nod/2;
    if(tata){
        Maxim[tata]=max(Maxim[2*tata],Maxim[2*tata+1]);
        Configure(tata);
    }
}

void Update(int poz,int val)
{
    Maxim[Indice[poz]]=val;
    Configure(Indice[poz]);
}

int main()
{
    f>>N>>M;
    Build(1,1,N);
    while(M){
        int op,a,b;
        f>>op>>a>>b;
        if(op==0){
            g<<Cauta_Maxim(1,a,b)<<'\n';
        }else{
            Update(a,b);
        }
        M--;
    }
    f.close();
    g.close();
    return 0;
}