Cod sursa(job #1349890)

Utilizator andrei_r_97Radoi Andrei andrei_r_97 Data 20 februarie 2015 15:45:45
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <stdlib.h>

#define N_MAX 100000
#define MAX(a,b) (((a)>(b))?(a):(b))

int arbore[N_MAX * 4 + 100];

void update(int nod, int left, int right, int val, int pos) {

  if ( left == right ) {
    arbore[nod] = val;
    return;
  }

  int mid = (left + right) / 2;
  if (mid >= pos) {
    update(2 * nod, left, mid, val, pos);
  }
  else {
    update(2 * nod + 1, mid + 1, right, val, pos);
  }

  arbore[nod] = MAX( arbore[2 * nod], arbore[2 * nod + 1]);

}

int query(int nod, int left, int right, int start, int finish) {

  if ( start <= left && right <= finish )
    return arbore[nod];

  int mid = (left + right) / 2;

  int x = 0, y = 0;

  if (start <= mid)
    x = query(2 * nod, left, mid, start, finish);
  if (mid < finish)
    y = query(2 * nod + 1, mid + 1, right, start, finish);

  return MAX(x,y);

}

int main()
{
  FILE *in  = fopen("arbint.in", "r");
  FILE *out = fopen("arbint.out", "w");

  int n, m;
  fscanf(in, "%d %d", &n, &m);

  int i;

  int x;
  for (i = 1; i <= n; i++) {
    fscanf(in, "%d", &x);
    update(1, 1, n, x, i);
  }

  int operatie, a, b;
  for (i = 1; i <= m; i++) {
    fscanf(in, "%d %d %d", &operatie, & a, &b);
    if (operatie == 0)
      fprintf(out, "%d\n", query(1, 1, n, a, b));
    else
      update(1, 1, n, b, a);
  }

  return 0;
}