Cod sursa(job #2605262)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 24 aprilie 2020 17:53:29
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include<cstdio>
#include<algorithm>
using namespace std;
FILE*in=fopen("rmq.in","r");
FILE*out=fopen("rmq.out","w");
int v[100003],po[19],n,m,i,j,k,pd[100003][19],mij,a,b,lg,ras;
int log(int p)
{
    int st=0,dr=i-2;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(po[mij]>p)
        {
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    while(po[mij]<p)
    {
        mij++;
    }
    while(po[mij]>=p)
    {
        mij--;
    }
    return mij;
}
int main()
{
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&v[i]);
        pd[i][0]=v[i];
    }
    po[0]=1;
    for(i=1;po[i-1]<=n;i++)
    {
        po[i]=po[i-1]*2;
    }
    for(j=1;j<i-1;j++)
    {
        for(k=1;k<=n-po[j]+1;k++)
        {
            pd[k][j]=min(pd[k][j-1],pd[k+po[j-1]][j-1]);
        }
    }
    for(j=1;j<=m;j++)
    {
        fscanf(in,"%d%d",&a,&b);
        if(a==b)
        {
            fprintf(out,"%d\n",v[a]);
            continue;
        }
        lg=log(b-a+1);
        ras=min(pd[a][lg],pd[b-po[lg]+1][lg]);
        fprintf(out,"%d\n",ras);
    }
}