Cod sursa(job #2010797)

Utilizator lupulescu2001Lupulescu Vlad lupulescu2001 Data 14 august 2017 13:27:58
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
short int a[17][100005],v[22]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16.384,32.768,65.536},b[100006];
int cautbin(int x)
{
    int left=0,right=16,mid,sol=-1;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(x>=v[mid])
            {
                sol=mid;
                left=mid+1;
            }
        else
            right=mid-1;

    }
    return sol;
}
int main()
{
    int n,i,x,y,z,k=1,m;
    fin>>n>>m;
    for(i=0;i<n;i++)
    {
        fin>>x;
        b[i]=x;
        if(i!=0)
        a[0][i]=min(x,y);
        y=x;
    }
    z=4;
    k=1;
    while(z<=n)
    {
        for(i=1;i<=n-z+1;i++)
        {
            a[k][i]=min(a[k-1][i],a[k-1][i+z/2]);
        }
        k++;
        z=z*2;
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        z=cautbin(y-x+1);
        if(z!=0)
        fout<<min(a[z-1][x],a[z-1][y-v[z]+1])<<'\n';
        else
            fout<<b[x-1];
    }

}