Cod sursa(job #2084837)

Utilizator vladcoroian2001Vlad Coroian vladcoroian2001 Data 9 decembrie 2017 12:15:21
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>

using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
const int nmax=1e5,INF=(1<<30);
int n,m,x[nmax],dp[nmax][20],a,b;
int sol(int x,int y)
{
    int d=y-x+1;
    int k=0;
    while((1<<(k+1))<=d)
        k++;
    return min(dp[x][k],dp[y-(1<<k)+1][k]);
}
int main()
{
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        fi>>x[i];
    for(int i=1;i<=n;i++)
        dp[i][0]=x[i];

    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
            dp[i][j]=INF;

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

    for(int i=1;i<=m;i++)
    {
        fi>>a>>b;
        fo<<sol(a,b)<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}