Cod sursa(job #2032458)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 5 octombrie 2017 01:50:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <stdio.h>
using namespace std;

const int N = 1e5;
int q,a,b,n,m;
int t[2 * N];

int combine(int a,int b)
{
    return max(a,b);
}

void build()
{
  for (int i = n - 1; i > 0; i--)
       t[i] = combine( t[i<<1] , t[(i<<1)+1] );
}

void modify(int p, int value)
{
  for (t[p += n-1] = value; p > 1; p >>= 1)
    t[p>>1] = combine( t[p] , t[p^1] );
}

int query(int l, int r)
{
  int Sol = -1;
  for( l += n-1, r += n-1 ; l <= r ; l >>= 1, r >>= 1 )
  {
      if( l%2 == 1 )
          Sol = combine( Sol, t[l++] );

      if( r%2 == 0 )
          Sol = combine( Sol, t[r--] );
  }
  return Sol;
}

int main()
{
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);

  scanf ("%d %d", &n, &m);

  for(int i = 0 ; i < n ; i++)
      scanf ("%d", &t[n+i]);
  build();

  for(int i = 0 ; i < m ; i++)
  {
      scanf ("%d %d %d", &q, &a, &b);
      if ( q == 0 )
          printf ("%d\n", query(a,b) );
      else
          modify(a,b);
  }

  //for(int i = 1 ; i <= 2*n-1 ; i++)
  //    printf("%d ",t[i]);

  fclose (stdin), fclose (stdout);
  return 0;
}