Cod sursa(job #2990170)

Utilizator etohirseCristi Cretu etohirse Data 7 martie 2023 16:43:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, m;
vector<int> aib;

void build(int st, int dr, int node);
void update(int st, int dr, int a, int b);
int query(int st, int dr, int a, int b, int node = 1);

int main() {
  fin >> n >> m;
  aib = vector<int>(4 * n, 0);

  build(1, n, 1);

  int a, b;
  while (m--) {
    fin >> a >> b;
    fout << query(1, n, a, b, 1) << '\n';
  }
  return 0;
}

void build(int st, int dr, int node) {
  if (st == dr) {
    fin >> aib[node];
    return;
  }

  int mb = st + (dr - st) / 2;
  build(st, mb, 2 * node);
  build(mb + 1, dr, 2 * node + 1);

  aib[node] = min(aib[node * 2], aib[node * 2 + 1]);
  return;
}

void update(int st, int dr, int a, int b, int node) {
  if (st == dr) {
    aib[node] = b;
    return;
  }

  int mb = st + (dr - st) / 2;
  if (mb >= a) {
    update(st, mb, a, b, 2 * node);
  } else {
    update(mb + 1, dr, a, b, 2 * node + 1);
  }

  aib[node] = min(aib[node * 2], aib[node * 2 + 1]);
  return;
}

int query(int st, int dr, int a, int b, int node) {
  if (a <= st && b >= dr) {
    return aib[node];
  }

  int mb = st + (dr - st) / 2;
  int ans = 1 << 30;
  if (mb >= a) {
    ans = min(ans, query(st, mb, a, b, 2 * node));
  }
  if (b > mb) {
    ans = min(ans, query(mb + 1, dr, a, b, 2 * node + 1));
  }

  return ans;
}