Cod sursa(job #2757121)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 3 iunie 2021 22:43:14
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

int DP[17][100005];

int main()
{
  freopen("rmq.in", "r", stdin);
  freopen("rmq.out", "w", stdout);

  int N, M;
  scanf("%d%d", &N, &M);
  for (int i = 1; i <= N; ++i)
    scanf("%d", &DP[0][i]);

  for (int step = 1; step <= 16; ++step) {
    int delta = 1 << (step - 1);
    for (int i = 1; i <= N; ++i)
      if (i + delta > N)
	DP[step][i] = DP[step][i - 1];
      else
	DP[step][i] = min(DP[step - 1][i], DP[step - 1][i + delta]);
  }

  for (int t = 0; t < M; ++t) {
    int a, b;
    scanf("%d%d", &a, &b);
    double len = b - a + 1;
    int delta = floor(log2(len));
    int step = 1 << delta;
    if (step == len)
      printf("%d\n", DP[delta][a]);
    else
      printf("%d\n", min(DP[delta][a], DP[delta][b - step + 1]));
  }
  
  
  return 0;
}