Cod sursa(job #2121127)

Utilizator vladavladaa vlada Data 3 februarie 2018 12:35:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int maxn=100005;
const int maxk=20;

int n,m,rmq[maxk][maxn],lg[maxn];
int remq(int x,int y)
{
    if(x>y)
        swap(x,y);
    int k=lg[y-x+1];
    int sol=rmq[k][x];
    if(rmq[k][y-(1<<k)+1]<sol)
        sol=rmq[k][y-(1<<k)+1];
    return sol;
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>rmq[0][i];
    for(int i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    for(int k=1;(1<<k)<=n;k++)
        for(int i=1;i+(1<<k)-1<=n;i++ )
        rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
    while(m--)
    {
        int x,y;
        fin>>x>>y;
        fout<<remq(x,y)<<'\n';

    }
    return 0;
}