Pagini recente » Cod sursa (job #1247961) | Cod sursa (job #2778166) | Cod sursa (job #1655263) | Cod sursa (job #349817) | Cod sursa (job #3144568)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct sir{
int x,y,rez;
}Sir;
int batog[320],v[100000];
Sir intrebari[1000000];
Sir * ordine[1000000];
int comp(const void * a, const void * b){
if(((Sir *) a)->x==((Sir *) b)->x){
return ((Sir *) a)->y-((Sir *) b)->y;
}
return ((Sir *) a)->x-((Sir *) b)->x;
}
int main()
{
FILE *fin, *fout;
int intrebare,min,rad,n,m,i,x,y;
fin=fopen("rmq.in", "r");
fscanf(fin, "%d%d", &n, &m);
rad=sqrt(n);
min=1000000;
for(i=0; i<n; i++){
fscanf(fin, "%d", &v[i]);
if(v[i]<min)
min=v[i];
if((i+1)%rad==0){
batog[i/rad]=min;
min=1000000;
}
}
fout=fopen("rmq.out", "w");
for(intrebare=0; intrebare<m; intrebare++){
fscanf(fin, "%d%d", &intrebari[intrebare].x, &intrebari[intrebare].y);
intrebari[intrebare].x--;
intrebari[intrebare].y--;
ordine[intrebare]=&intrebari[intrebare];
}
qsort(ordine, m, sizeof(Sir *), comp);
for(intrebare=0; intrebare<m; intrebare++){
if(intrebare>0&&ordine[intrebare-1]->x==ordine[intrebare]->x){
min=ordine[intrebare-1]->rez;
i=ordine[intrebare-1]->y+1;
}
else{
min=1000000;
i=ordine[intrebare]->x;
}
while(i<=ordine[intrebare]->y){
if(i%rad==0&&i+rad<=ordine[intrebare]->y){
if(batog[i/rad]<min)
min=batog[i/rad];
i+=rad;
}
else{
if(v[i]<min)
min=v[i];
i++;
}
}
ordine[intrebare]->rez=min;
fprintf(fout,"%d\n",intrebari[intrebare].rez);
}
fclose(fin);
fclose(fout);
return 0;
}