Cod sursa(job #1916992)

Utilizator geo_furduifurdui geo geo_furdui Data 9 martie 2017 10:51:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>

using namespace std;
ifstream cin ("rmq.in");
ofstream cout ("rmq.out");
int best[25][100010],m,k;
int n;
void read ()
{
      cin>>n>>m;
      for(int i=1;i<=n;i++)
            cin>>best[0][i];
      int r=1;
      while(r<=n) r*=2,k++; k--;
}
void rmq ()
{
      for(int i=0;i<k;i++)
      { int y=1<<i;
            for(int j=1;j<=n-y;j++)
                  best[i+1][j]=min(best[i][j],best[i][j+y]);
      }
}
void answare ()
{ int a,b;
      for(int i=1;i<=m;i++)
      {
            cin>>a>>b;
            if(a==b) cout<<best[0][a]<<"\n";
            else {
            int dif=b-a;
            int r=1,l=0;
            while(r<=dif) r*=2,l++; --l; r/=2;
            cout<<min(best[l][a],best[l][b-r+1])<<"\n"; }
      }
}
int main()
{
    read();
    rmq();
    answare();
    cin.close();
    cout.close();
    return 0;
}