Cod sursa(job #2382820)

Utilizator Vlad_NituNitu Vlad-Petru Vlad_Nitu Data 18 martie 2019 18:18:27
Problema Arbori de intervale Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;
ifstream f ("arbint.in") ;
ofstream g ("arbint.out") ;
int arb[4*DIM+10] , v[DIM] , N , M ;
int st, dr , a ,b , pozitie , valoare ,cer;
int Max ;
int Query(int nod ,int st ,int dr,int a,int b) ;
void Update(int nod ,int st , int dr) ;

void Update(int nod ,int st ,int dr)
{
    if (st == dr)
        arb[nod] = valoare;
    else
    {
        int mij = (st + dr) / 2;
        if (pozitie <= mij) Update(2*nod,st,mij) ;
        else Update(2*nod+1,mij+1,dr) ;

        arb[nod] = max(arb[2*nod] , arb[2*nod+1]) ;
    }
}
int Query(int nod ,int st , int dr, int a, int b)
{
    int r1=0, r2=0;
    if (a <= st && dr <= b)
    {
        return arb[nod] ;
    }
    else
    {
       int  mij = (st+dr) / 2;
        if (a <= mij) r1=Query(2*nod,st,mij,a,b) ;
        if (b > mij)
            r2=Query(2*nod+1,mij+1,dr,a,b) ;
        return max(r1,r2);
    }
}
int main()
{
    f >> N >> M ;
    int x;


    // Construieste arborele
    for (int i = 1 ; i <= N ; ++i)
    {
    f >> x;
        pozitie = i;
        valoare = x;
        Update(1,1,N) ;
    }


    for (int i = 1 ; i <= M ; ++i)
    {
        f >> cer >> a >> b;
        if (cer == 0)
        {
            Max = -1;
           g <<  Query(1,1,N,a,b) << '\n';

        }
        else
        {
            pozitie = a;
            valoare = b;
            Update(1,1,N);

         g << '\n';
        }

    }
     //for (int i = 1 ; i <= 2 *N - 1 ; ++i)
    //g << arb[i] << ' ' ;
return 0;
}