Cod sursa(job #2693429)

Utilizator GrizzyProblemSolver79cNot telling GrizzyProblemSolver79c Data 5 ianuarie 2021 22:18:31
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

int const INF = 1000000000;
int const NMAX = 100000;
int n, m;
int seg[1 + 4*NMAX];

int query(int node, int left, int right, int from, int to) {
  int mid = (left+right)/2;
  if(left == from && right == to) {
    return seg[node];
  } else {
    int n1, n2;
    n1 = n2 = INF;
    if(from <= mid) {
      n1 = query(2*node, left, mid, from, min(mid, to));
    }
    if(mid+1 <= to) {
      n2 = query(2*node + 1, mid+1, right, max(from, mid+1), to);
    }
    return min(n1, n2);
  }
}

void update(int node, int left, int right, int pos, int val) {
  int mid = (left+right)/2;
  if(left == right) {
    seg[node] = val;
    assert(left == pos);
  } else {
    if(pos <= mid) {
      update(2*node, left, mid, pos, val);
    } else {
      update(2*node + 1, mid+1, right, pos, val);
    }
    seg[node] = min(seg[2*node], seg[2*node + 1]);
  }
}

int main() {
  in >> n >> m;
  for(int i = 1; i <= n; i++) {
    int x;
    in >> x;
    update(1, 1, n, i, x);
  }
  for(int i = 1; i <= m; i++) {
    int le, ri;
    in >> le >> ri;
    out << query(1, 1, n, le, ri) << "\n";
  }
}