Cod sursa(job #2284671)

Utilizator alex_bb8Banilean Alexandru-Ioan alex_bb8 Data 17 noiembrie 2018 12:29:34
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;

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

int pw[25],v[100001],mat[20][100001],x,y,n,m;

int sr(int s,int d,int x)
{

  int sol=99,m;

  while(s<=d)
  {
    m=(s+d)/2;
    if(x>=pw[m]) {sol=m;s=m+1;}
    else d=m-1;
  }

  return sol;
}

int main()
{

    for(int i=0;i<=20;i++)
     pw[i]=(1<<i);

    f>>n>>m;
    for(int i=1;i<=n;i++)
     f>>v[i],mat[0][i]=v[i];

    int u=sr(0,20,n);

    for(int i=1;i<=u;i++)
     for(int j=1;j<=n-(1<<i)+1;j++)
      mat[i][j]=min(mat[i-1][j],mat[i-1][j+(1<<i-1)]);

    for(int i=1;i<=m;i++)
    {
        f>>x>>y;
        int p=sr(0,20,(y-x+1));
        g<<min(mat[p][x],mat[p][y-(1<<p)+1])<<"\n";
    }


    return 0;
}