Cod sursa(job #1640112)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 8 martie 2016 15:53:48
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
using namespace std;
# define NMAX 100003
# define LMAX 32
//rmq[i][j]=min din intervalul j..j+2^i-1
int rmq[LMAX][NMAX];
int lg[NMAX],v[NMAX];
int main()
{
    ifstream fin ("rmq.in");
    ofstream fout ("rmq.out");
    int n;
    fin>>n;
    for (int i=1;i<=n;++i)
    {
        fin>>v[i];
    }
    lg[1]=0;
    for (int i=2;i<=n;++i)
    {
        lg[i]=lg[i/2]+1;
    }
    for (int i=1;i<=n;++i)
    {
        rmq[0][i]=v[i];
    }
    for (int i=1;i<=lg[n];++i)
    {
        for (int j=1;j+(1<<i)-1<=n;++j)
        {
            rmq [i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))+1]);
        }
    }
    int m;
    int p1,p2;
    fin>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>p1>>p2;
        int k=lg[p2-p1+1];
        fout<<min(rmq[k][p1],rmq[k][p2-(1<<k)+1])<<"\n";
    }
}