Cod sursa(job #2222611)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 17 iulie 2018 14:32:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N,M,A[2000000],V[100003];

void Update(int Nod,int L,int R,int P,int Val){
    if(L==R){
        A[Nod]=Val;
        return;
    }
    int Mid=(L+R)/2;
    int LSon=2*Nod,RSon=2*Nod+1;
    if(P<=Mid)
        Update(LSon,L,Mid,P,Val);
    else
        Update(RSon,Mid+1,R,P,Val);
    A[Nod]=max(A[LSon],A[RSon]);
}

int Query(int Nod,int L,int R,int QL,int QR){
    if(QL<=L && QR>=R){
        return A[Nod];
    }
    int Ans=-20,Mid=(L+R)/2;
    int LSon=2*Nod,RSon=2*Nod+1;
    if(QL<=Mid)
        Ans=max(Ans,Query(LSon,L,Mid,QL,QR));
    if(QR>Mid)
        Ans=max(Ans,Query(RSon,Mid+1,R,QL,QR));
    return Ans;
}

void Build(int Nod,int L,int R){
    if(L==R){
       A[Nod]=V[L];
       return;
    }
    int Mid=(L+R)/2;
    int LSon=2*Nod,RSon=2*Nod+1;
    Build(LSon,L,Mid);
    Build(RSon,Mid+1,R);
    A[Nod]=max(A[LSon],A[RSon]);
}

int main()
{
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        fin>>V[i];
    Build(1,1,N);
    for(int i=1;i<=M;i++){
        int X,Y,Z;
        fin>>X>>Y>>Z;
        if(X==0)
           fout<<Query(1,1,N,Y,Z)<<'\n';
        else
           Update(1,1,N,Y,Z);
    }

    return 0;
}