Cod sursa(job #1672656)

Utilizator axelteoTeodor Dutu axelteo Data 2 aprilie 2016 22:25:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <cstdio>
using namespace std;
FILE *in,*out;
int rmq[17][100001],n,q,log[100001],p[18];
int main()
{
    in=fopen("rmq.in","r");
    out=fopen("rmq.out","w");
    int i,j,d,x,y;
    fscanf(in,"%d%d",&n,&q);
    for(i=1;i<=n;++i)fscanf(in,"%d",&rmq[0][i]);
    log[1]=0;
    for(i=2;i<=n;++i)log[i]=log[i/2]+1;
    p[0]=1;
    for(i=1;i<=18;++i)p[i]=p[i-1]*2;
    for(i=1;p[i]<=n;++i)for(j=1;j<=n-p[i]+1;++j)
    {
        if(rmq[i-1][j]>rmq[i-1][j+p[i-1]])rmq[i][j]=rmq[i-1][j+p[i-1]];
        else rmq[i][j]=rmq[i-1][j];
    }
    for(i=1;i<=q;++i)
    {
        fscanf(in,"%d%d",&x,&y);
        d=log[y-x];
        if(rmq[d][x]>rmq[d][y-p[d]+1])fprintf(out,"%d\n",rmq[d][y-p[d]+1]);
        else fprintf(out,"%d\n",rmq[d][x]);
    }
    fclose(in);fclose(out);
    return 0;
}