Pagini recente » Profil Raz_Van_Barbascu | Cod sursa (job #515943) | Monitorul de evaluare | Cod sursa (job #872040) | Cod sursa (job #178891)
Cod sursa(job #178891)
#include <stdio.h>
#define MAXN 100100
#define MAXM 1000100
struct question
{
int x,y;
};
int a[MAXN][20];
int v[MAXN];
int n,m;
int p2[20];
int log[MAXN];
question VM[MAXM];
void citire()
{
int i;
scanf("%d%d",&n,&m);
for (i=0; i<n; ++i)
scanf("%d",&v[i]);
for (i=0; i<m; i++)
{
scanf("%d%d",&VM[i].x,&VM[i].y);
VM[i].x--;
VM[i].y--;
}
}
inline int minim(int a, int b)
{
if (a>b)
return b;
return a;
}
void makea()
{
int i,j;
for (i=1,p2[0]=1; i<20; i++)
p2[i]=p2[i-1]<<1;
for (i=0; i<n; i++)
a[i][0]=v[i];
for (i=n-1; i>=0; i--)
for (j=1; i+p2[j]<=n; j++)
a[i][j]=minim(a[i][j-1],a[i+p2[j-1]][j-1]);
}
void makelog()
{
int i,j;
log[0]=0;
for (i=1,j=0; i<n; i++)
if (p2[j+1]>i)
log[i]=j;
else
log[i]=++j;
}
void rezolva()
{
int i,l,r;
for (i=0; i<m; i++)
{
l=log[VM[i].y-VM[i].x+1];
r=minim(a[VM[i].x][l],a[VM[i].y-p2[l]+1][l]);
printf("%d\n",r);
}
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
citire();
makea();
makelog();
rezolva();
fclose(stdin);
fclose(stdout);
return 0;
}