Cod sursa(job #2241425)

Utilizator IustinPetrariuIustinian Petrariu IustinPetrariu Data 15 septembrie 2018 19:55:06
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#define NMAX 10001
#define LMAX 18
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[NMAX],lg[NMAX];
int sparse[NMAX][LMAX];
int N,M;
int main()
{
    fin>>N>>M;
    for(int i = 1 ; i <= N; i++)
        fin>>a[i];

    lg[1]=0;
    for(int i = 2; i <= N; i++)
        lg[i]=lg[i/2]+1;

        for(int i = 1 ; i <= N; i++)
            sparse[i][0]=i;
        for(int j = 1; (1<<j) <= N; j++)
          for(int i = 1 ; i + (1<<j) - 1 <= N; i++)
          {
              if(a[sparse[i][j-1]] < a[sparse[i+(1<<(j-1))][j-1]])
                sparse[i][j]=sparse[i][j-1];
              else sparse[i][j]=sparse[i+(1<<(j-1))][j-1];
          }
      long int l,k,diff,low,high;
      for(int i = 1; i <= M; i++)
      {
          fin>>low>>high;
          diff=high-low+1;
          k=lg[diff];
          fout<<min(a[sparse[low][k]],a[sparse[low+diff-(1<<k)][k]])<<'\n';
      }

    return 0;