Cod sursa(job #2525075)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 16 ianuarie 2020 19:25:23
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>
#include <fstream>
#include <iostream>

using namespace std;
#define dim 100001


int N, M, i ,j;
int MaxArb[4*dim+66];
int start, finish, Val, Pos, maxim;

inline int Maxim(int a, int b) {
       if ( a > b ) return a;
       else return b;
}

ifstream fin;
ofstream fout;

void Update(int,int,int);
void Query(int,int,int);



int main(){
    int X, A, B;

    fin.open("arbint.in");
    fin>>N>>M;
    for (i=1; i<=N; i++){
        fin>>X;
        Pos = i, Val = X;
        Update(1,1,N);
    }

    fout.open("arbint.out");

    for (i=1; i<=M; i++){
        fin>>X>>A>>B;

        if (X==0){
             maxim = -1;
             start = A, finish = B;
             Query(1,1,N);
             fout<<maxim<<"\n";
        }
        else
        {
            Pos = A, Val = B;
            Update(1,1,N);
        }
    }

    fin.close();
    fout.close();
}



void Update(int nod, int left, int right){
     if ( left == right )
     {
        MaxArb[nod] = Val;
        return;
     }


     int div = (left+right)/2;

     if ( Pos <= div )
        Update(2*nod,left,div);
     else
        Update(2*nod+1,div+1,right);

     MaxArb[nod] = Maxim( MaxArb[2*nod], MaxArb[2*nod+1] );
}



void Query(int nod, int left, int right){
     if ( start <= left && right <= finish ){
        if ( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
        return;
     }

     int div = (left+right)/2;
     if ( start <= div ) Query(2*nod,left,div);
     if ( div < finish ) Query(2*nod+1,div+1,right);
}