Cod sursa(job #1560874)

Utilizator lolmanDomuta Dariu lolman Data 3 ianuarie 2016 14:07:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
using namespace std;

int i,j, rmq[18][100001], a[100001],n,m,x,y;

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

int biggestpower(int b)
   {
       int p=1;
       int k=0;
       while (2*p<=b)
       {
           p=p*2;
           k++;
       }
       return k;
   }
int topower(int b, int power)
   {
       if (power==0) return 1;
       for (int l=1;l<power;l++)
            b=b*2;
       return b;
   }

void precalculations()
    {
       int maxpower=biggestpower(n);
       for (i=1;i<=maxpower;i++)
               for (j=1;j<=n-topower(2,i)+1;j++)
                      rmq[i][j] = min( rmq[i-1][j] , rmq[i-1][j+topower(2,i-1)]);
    }

void solve()
    {
        for (i=1;i<=m;i++)
        {
            f>>x>>y;
            int maxpower=biggestpower(y-x);
            int sol=min(rmq[maxpower][x] , rmq[maxpower][y-topower(2,maxpower)+1]);
            g<<sol<<'\n';
        }
    }
int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        f>>a[i];
    for (i=1;i<=n;i++)
        rmq[0][i]=a[i];
    precalculations();
    solve();
    return 0;
}