Pagini recente » Cod sursa (job #2732798) | Cod sursa (job #987013) | Cod sursa (job #591567) | Cod sursa (job #2828632) | Cod sursa (job #1372213)
#include <fstream>
#include <cstdio>
#define INF 100001
using namespace std;
ofstream fout("rmq.out");
int a[INF],n,k,m[350],sqr,nr,j;
void read()
{
scanf("%d%d",&n,&k);
for(sqr=1;sqr*sqr<=n;sqr++);
sqr--; nr=0;
for(int i=1;i<=sqr;i++)
{
scanf("%d",&a[++nr]);
m[i]=nr;
for(j=2;j<=sqr;j++)
{
scanf("%d",&a[++nr]);
if(a[nr]<a[m[i]]) m[i]=nr;
}
}
if(sqr*sqr<n)
{
scanf("%d",&a[++nr]);
m[sqr+1]=nr;
while(nr<n)
{
scanf("%d",&a[nr]);
if(a[nr]>a[m[sqr+1]]) m[sqr+1]=nr;
nr++;
}
}
}
int maxim(int a,int b)
{
if(a<b) return b;
else return a;
}
int minim(int inc,int sf)
{
int vmin=INF;
if(sf-inc>=sqr)
{
int SQinc=inc/sqr+1;
if(inc%sqr!=0) SQinc++;
for(int i=inc;i<SQinc*sqr;i++)
if(a[i]<vmin) vmin=a[i];
for(int i=SQinc;i*sqr<=sf;i++)
if(a[m[i]]<vmin) vmin=a[m[i]];
for(int i=sf/sqr*sqr+1;i<=sf;i++)
if(a[i]<vmin) vmin=a[i];
}
else
for(int i=inc;i<=sf;i++)
if(a[i]<vmin) vmin=a[i];
return vmin;
}
int main()
{
freopen("rmq.in","r",stdin);
read();
int x,y;
for(int i=1;i<=k;i++)
{
scanf("%d%d",&x,&y);
fout<<minim(x,y)<<'\n';
}
return 0;
}