Cod sursa(job #247398)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 22 ianuarie 2009 23:26:01
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>

int A[100000][17],p[17],lg[100000];

int main()
{
FILE *in = fopen("rmq.in","r");
FILE *out = fopen("rmq.out","w");

int n,m,i,j,put,x;

fscanf(in,"%d%d",&n,&m);
for (i=1;i<=n;i++) fscanf(in,"%d",&A[i][0]);

put = 0;
lg[1] = 0;
p[0] = 1;
x = 1;
for (i=1;i<=100000;i++)
{
if (2*x<=i) {
            x = 2*x;
            p[++put] = x;
            }
lg[i] = put;
}
for (i=n;i;i--)
{
j=1;
while (i+p[j]<=n+1) {
                    if (A[i][j-1]<A[i+p[j-1]][j-1]) A[i][j] = A[i][j-1];
                    else A[i][j] = A[i+p[j-1]][j-1];
                    j++;
                    }
}
int y,k;
for (;m;m--)
{
fscanf(in,"%d%d",&x,&y);
k = lg[y-x+1];
if (A[x][k]<A[y-p[k]+1][k]) fprintf(out,"%d\n",A[x][k]);
else fprintf(out,"%d\n",A[y-p[k]+1][k]);
}
fclose(in);fclose(out);
}