Cod sursa(job #1497872)

Utilizator andi12Draghici Andrei andi12 Data 7 octombrie 2015 18:19:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>

using namespace std;
const int N=100005;
int rmq[18][N];
int lg[N];
int min(int a,int b)
{
    if(a<b)
        return a;
    else
        return b;
}
int main()
{
    FILE *in,*out;
    in=fopen("rmq.in","r");
    out=fopen("rmq.out","w");
    int n,m,i,j,pow,k,a,b,dif,l,ras;
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
        fscanf(in,"%d",&rmq[0][i]);
    for(i=1;1<<i<=n;i++)
    {
        for(j=1<<i;j<=n;j++)
        {
            pow=1<<(i-1);
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j-pow]);
        }
    }
    for(i=1;i<=n;i++)
        lg[i]=lg[i/2]+1;
    for(i=1;i<=n;i++)
        lg[i]--;
    for(k=1;k<=m;k++)
    {
        fscanf(in,"%d%d",&a,&b);
        dif=b-a+1;
        l=lg[dif];
        pow=1<<l;
        ras=min(rmq[l][b],rmq[l][a+pow-1]);
        fprintf(out,"%d\n",ras);
    }
    return 0;
}