Pagini recente » Borderou de evaluare (job #1356646) | Borderou de evaluare (job #820644) | Borderou de evaluare (job #1690723) | Borderou de evaluare (job #2646825) | Cod sursa (job #432180)
Cod sursa(job #432180)
#include <stdio.h>
#include <math.h>
#define GNT 2000000000;
long N,M,P,v[100002],min[1002],i,j,x,y,rad,rad1,rad2,Sol;
double wd;
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&N,&M);
for(i=1;i<=N;i++)
scanf("%ld",&v[i]);
wd=N;
wd=sqrt(wd);
rad=wd;
for(i=1;i<=N/rad;i++)
{
min[i]=GNT;
for(j=(i-1)*rad+1;j<=i*rad;j++)
if(v[j]<min[i]) min[i]=v[j];
}
P=N/rad;
if(N%rad!=0)
{
P++;
min[P]=GNT;
for(i=(N/rad)*rad+1;i<=N;i++)
if(v[i]<min[P]) min[P]=v[i];
}
for(i=1;i<=M;i++)
{
scanf("%ld%ld",&x,&y);
rad1=0;
while(rad1<x) rad1+=rad;
rad2=rad1-rad;
while(rad2<=y) rad2+=rad;
rad2-=rad;
Sol=GNT;
if(rad1<=rad2)
{
for(j=x;j<=rad1;j++)
if(v[j]<Sol) Sol=v[j];
for(j=rad2+1;j<=y;j++)
if(v[j]<Sol) Sol=v[j];
for(j=rad1/rad+1;j<=rad2/rad;j++)
if(min[j]<Sol) Sol=min[j];
}
else
for(j=x;j<=y;j++)
if(Sol>v[j]) Sol=v[j];
printf("%ld\n",Sol);
}
return 0;
}