Cod sursa(job #2340622)

Utilizator radurotaruRotaru Radu Stefan radurotaru Data 10 februarie 2019 19:08:06
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <cmath>
using namespace std;

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


int n,a[100001],m[100001][20],k,x,y,r,dif;
void rmq()
{
    for(int i=1; i<=n; i++)
        m[i][0]=i;
    for(int i=1; (1<<i)<=n; i++)
    {
        for(int j=1; j+(1<<i)-1<=n; j++)
        {
            if(a[m[j][i-1]] < a[m[j+(1<<(i-1))][i-1]])
                m[j][i]=m[j][i-1];
            else
                m[j][i]=m[j+(1<<(i-1))][i-1];
        }
    }
}


int main()
{
    f>>n>>r;
    for(int i=1; i<=n; i++)
        f>>a[i];
    rmq();
    for(int i=1; i<=r; i++)
    {
        f>>x>>y;
        dif=y-x+1;
        k=log2(dif);
        if(a[m[x][k]] <= a[m[y-(1<<k)+1][k]])
            g<<a[m[x][k]]<<'\n';
        else
            g<<a[m[y-(1<<k)+1][k]]<<'\n';
    }

    return 0;
}