Pagini recente » Cod sursa (job #163908) | Cod sursa (job #179280) | Cod sursa (job #2548648) | Cod sursa (job #1134604) | Cod sursa (job #1321510)
#include <cstdio>
#define NMAX 100005
#define INF 1<<30
using namespace std;
FILE* fin=fopen("rmq.in","r");
FILE* fout=fopen("rmq.out","w");
int rmq[NMAX][32],t[NMAX],n,m;
int query(int st,int dr);
int minim(int a,int b)
{
if (a<b) return a; return b;
}
int main()
{
int i,j,a,b,logn=0,x=1;
fscanf(fin,"%d %d",&n,&m);
for (i=1; i<=n; i++)
{
fscanf(fin,"%d",&t[i]);
rmq[i][0]=t[i];
}
while (x<n)
{
x=x<<1;
logn++;
}
for (j=1; j<=logn; j++)
{
for (i=1<<j; i<=n; i++)
rmq[i][j]=minim(rmq[i][j-1],rmq[i-(1<<(j-1))][j-1]);
}
for (i=1; i<=m; i++)
{
fscanf(fin,"%d %d",&a,&b);
fprintf(fout,"%d\n",query(a,b));
}
return 0;
}
int query(int st,int dr)
{
int i,nr,vmin=INF,pt=0,capat;
capat=dr;
nr=dr-st+1;
while (capat>=st)
{
while ( (nr & 1) != 1)
{
nr=nr>>1;
pt++;
}
//sum+=rmq[capat][pt];
if (vmin>rmq[capat][pt]) vmin=rmq[capat][pt];
capat=capat-(1<<pt);
pt++;
}
return vmin;
}