Cod sursa(job #1503542)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 16 octombrie 2015 14:24:00
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX(A, B) ((A) > (B) ? (A) : (B))

int T[2 * MAX_N];
int n;

void aintSet(int x, int key) {
  int q;

  x += n;
  T[x] = key;
  while ( x > 1 ) {
    q = x >> 1;
    T[q] = MAX( T[x], T[x ^ 1] );
    x = q;
  }
}

int aintQuery(int x, int y) {
  int q = -1;

  x += n;
  y += n;
  while ( x < y ) {
    if ( x & 1 ) {
      q = MAX( q, T[x] );
      x++;
    }
    if ( y & 1 ) {
      y--;
      q = MAX( q, T[y] );
    }
    x >>= 1;
    y >>= 1;
  }
  return q;
}

int main(void) {
  FILE *fin = fopen("arbint.in", "r");
  FILE *fout = fopen("arbint.out", "w");
  int m, i;
  int opType, x, y;

  fscanf( fin, "%d%d", &n, &m );
  for ( i = 0; i < n; i++ ) {
    fscanf( fin, "%d", &T[i + n] );
  }

  for ( i = n - 1; i > 0; i-- ) {
    T[i] = MAX( T[i << 1], T[(i << 1) | 1] );
  }

  for ( i = 0; i < m; i++ ) {
    fscanf( fin, "%d%d%d", &opType, &x, &y );
    if ( opType == 0 ) {
      fprintf( fout, "%d\n", aintQuery( x - 1, y ) );
    } else {
      aintSet( x - 1, y );
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}