Nu aveti permisiuni pentru a descarca fisierul grader_test2.ok
Cod sursa(job #154421)
| Utilizator | Data | 11 martie 2008 10:32:14 | |
|---|---|---|---|
| Problema | Range minimum query | Scor | 40 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.16 kb |
#include<stdio.h>
int A[100010][20];
int p2[25];
int main(){
FILE *fin = fopen("rmq.in","r"),
*fout = fopen("rmq.out","w");
int N,M;
fscanf(fin,"%d%d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(fin,"%d",&A[i][0]);
int lim = 0;
while( (1<<lim) <= N ) lim++;
lim --;
p2[0] = 1;
for(int i=1;i<=lim+1;i++) p2[i] = 2*p2[i-1];
for(int j=1;j<=lim;j++)
for(int i=1;i<=N;i++){
A[i][j] = A[i][j-1];
if(i+p2[j-1] <= N && A[i+p2[j-1]][j-1] < A[i][j])
A[i][j] = A[i+p2[j-1]][j-1];
}
/*
for(int i=1;i<=N;i++){
for(int j=0;j<=lim;j++)
fprintf(fout,"%d ",A[i][j]);
fprintf(fout,"\n");
}
*/
for(int i=1;i<=M;i++){
int li,lf;
fscanf(fin,"%d%d",&li,&lf);
int k = 0;
while(p2[k] <= lf-li+1) k++;
k--;
int sol = 10000000;
while(k>=0){
if(p2[k] > lf-li+1)
k--;
else{
if(A[li][k] < sol)
sol = A[li][k];
li+=p2[k];
k--;
}
}
fprintf(fout,"%d\n",sol);
}
fclose(fin);
fclose(fout);
return 0;
}
