Cod sursa(job #2659856)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 17 octombrie 2020 17:39:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

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

const int Nmax = 100000;
int N,M,maxim;
int Arb[4*Nmax+5];

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

void Query(int K,int L,int R,int QL, int QR){
    if(QL <= L && R <= QR){ //segmentul e inclus in segmentul de query
        maxim = max(maxim,Arb[K]);
        return;
    }
    if(R < QL || QR < L) return; //segmentul e inafara segmentului de query

    int Mid = (L+R)/2;

    Query(2*K,L,Mid,QL,QR);
    Query(2*K+1,Mid+1,R,QL,QR);
}

int main()
{
    int val;
    fin>>N>>M;
    for(int i = 1; i <= N; i++){
        fin>>val;
        Update(1,1,N,i,val);
    }
    int a,b,task;
    for(int i = 1; i <= M; i++){
        fin>>task>>a>>b;
        if(task){
            Update(1,1,N,a,b);
        }else{
            maxim = 0;
            Query(1,1,N,a,b);
            fout<<maxim<<'\n';
        }
    }
    return 0;
}