Cod sursa(job #2309107)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 decembrie 2018 14:34:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100002;

int N, Q;
int tree[ ( 1 << 18 ) ];

void Update( int nod, int lf, int rg, int val, int pos )
{
  if( lf == rg )
  {
    tree[nod] = val;
    return;
  }

  int mid = ( lf + rg ) / 2;

  if( pos <= mid ) Update( nod * 2, lf, mid, val, pos );
  if( pos > mid )  Update( nod * 2 + 1, mid + 1, rg, val, pos );

  tree[nod] = max( tree[nod * 2], tree[nod * 2 + 1] );
}

int Query( int nod, int lf, int rg, int L, int R )
{
  if( L <= lf && rg <= R ) return tree[nod];

  int mid = ( lf + rg ) / 2;

  int q1, q2;

  if( L <= mid ) q1 = Query( nod * 2, lf, mid, L, R );
  else q1 = -1;

  if( R > mid ) q2 = Query( nod * 2 + 1, mid + 1, rg, L, R );
  else q2 = -1;

  return max( q1, q2 );
}

void Read()
{
   fin >> N >> Q;

   int aux;

   for( int i = 1; i <= N; ++i )
   {
     fin >> aux;

     Update( 1, 1, N, aux, i );
   }

   int tip, a, b;

   for( int i = 1; i <= Q; ++i )
   {
     fin >> tip >> a >> b;

     if( tip == 0 ) fout << Query( 1, 1, N, a, b ) << '\n';
     else
       {
         Update( 1, 1, N, b, a );
       }
   }

   //for( int i = 1; i <= N; ++i )
   //  fout << tree[i] << ' ';

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

int main()
{
    Read();

    return 0;
}