Cod sursa(job #2817395)

Utilizator GrandmasterSoucup Bogdan Grandmaster Data 13 decembrie 2021 16:43:17
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 kb
#include <iostream>
#include <stdio.h>
#include <map>

using namespace std;

#define mmap map<pair<int32_t, int32_t>, int32_t>

int32_t constructInterval_t(int32_t *buffer, int32_t left, int32_t right, mmap &response) {
  if(left >= right) {
    response[make_pair(left, left)] = buffer[left];
    return buffer[left];
  }
  int32_t middle = (right + left) / 2;
  int32_t leftMin = constructInterval_t(buffer, left, middle, response);
  int32_t rightMin = constructInterval_t(buffer, middle + 1, right, response);
  int32_t minValue = max(leftMin, rightMin);
  response[make_pair(left, right)] = minValue;
  return minValue;
}

mmap constructInterval(int32_t *buffer, int32_t sz) {
  mmap resp;
  constructInterval_t(buffer, 0, sz - 1, resp);
  return resp;
}

void updateTree_t(int32_t left, int32_t right, int32_t index, int32_t element, mmap &response) {
  if(left == right && index == left) {
    response[make_pair(left, right)] = element;
    return ;
  }
  if(index < left || index > right) {
    return ;
  }
  int32_t middle = (right + left) / 2;
  updateTree_t(left, middle, index, element, response);
  updateTree_t(middle + 1, right, index, element, response);
  if(left <= index && right >= index) {
    response[make_pair(left, right)] = max(response[make_pair(left, middle)], response[make_pair(middle + 1, right)]);
  }
}

void updateTree(int32_t index, int32_t element, int32_t n, mmap &response) {
  updateTree_t(0, n, index, element, response);
}

int32_t getMinInterval_t(int32_t left, int32_t right, int32_t leftDesired, int32_t rightDesired, mmap &response) {
  if(left >= leftDesired && right <= rightDesired) {
    return response[make_pair(left, right)];
  }
  if((left < leftDesired && right < leftDesired) || (left > rightDesired && right > rightDesired)) {
    return 0;
  }
  int32_t middle = (right + left) / 2;
  return max(getMinInterval_t(left, middle, leftDesired, rightDesired, response), getMinInterval_t(middle + 1, right, leftDesired, rightDesired, response));
}

int32_t getMinInterval(int32_t left, int32_t right, int32_t n, mmap &response) {
  return getMinInterval_t(0, n, left, right, response);
}

int main() {
  int32_t n, m, *buffer = (int32_t *)malloc(sizeof(int32_t) * 100001);
  FILE *fd = fopen("arbint.in", "r+");
  FILE *fr = fopen("arbint.out", "w+");
  fscanf(fd, "%d %d", &n, &m);
  for(int32_t i = 0; i < n; i++) {
    fscanf(fd, "%d", &buffer[i]);
  }
  mmap resp = constructInterval(buffer, n);
  free(buffer);
  for(int32_t i = 0; i < m; i++) {
    int32_t a, b, c;
    fscanf(fd, "%d %d %d", &c, &a, &b);
    if(!c) {
      fprintf(fr, "%d\n", getMinInterval(a - 1, b - 1, n - 1, resp));
    }
    else {
      updateTree(a - 1, b, n - 1, resp);
    }
  }
}