Cod sursa(job #1673274)

Utilizator stoianmihailStoian Mihail stoianmihail Data 3 aprilie 2016 16:49:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <assert.h>

struct node {
  int val;
  node *l, *r;
};

int N, M;

int MAX(int X, int Y) {
  return X > Y ? X : Y;
}

void update(node* &u, int left, int right, int pos, int val) {
  if (left == right) {
    u -> val = val;
    return;
  }

  if (u -> l == NULL) {
    u -> l = new node;
    u -> l -> val = 0;
  }
  if (u -> r == NULL) {
    u -> r = new node;
    u -> r -> val = 0;
  }

  int mid = (left + right) >> 1;

  if (pos <= mid) {
    update(u -> l, left, mid, pos, val);
  } else {
    update(u -> r, mid + 1, right, pos, val);
  }
  u -> val = MAX(u -> l -> val, u -> r -> val);
}

void query(node *u, int left, int right, int a, int b, int *max) {
  if ((a <= left) && (right <= b)) {
    *max = MAX(*max, u -> val);
    return;
  }

  int mid = (left + right) >> 1;

  if (a <= mid) {
    query(u -> l, left, mid, a, b, max);
  }
  if (b > mid) {
    query(u -> r, mid + 1, right, a, b, max);
  }
}

int main(void) {
  int i, val;
  FILE *f = fopen("arbint.in", "r");

  node *root = new node;
  
  fscanf(f, "%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    fscanf(f, "%d", &val);
    update(root, 1, N, i, val);
  }

  int task, a, b, max;
  freopen("arbint.out", "w", stdout);
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d %d", &task, &a, &b);
    if (task == 0) {
      max = 0;
      query(root, 1, N, a, b, &max);
      fprintf(stdout, "%d\n", max);
    } else {
      update(root, 1, N, a, b);
    }
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}