Pagini recente » Cod sursa (job #770949) | Cod sursa (job #349554) | Cod sursa (job #3248520) | Cod sursa (job #2823174) | Cod sursa (job #178895)
Cod sursa(job #178895)
#include <stdio.h>
#define MAXN 100100
int a[MAXN][20];
int v[MAXN];
int n,m;
int p2[20];
int log[MAXN];
void citire()
{
int i;
char temp[50];
scanf("%d%d",&n,&m);
gets(temp);
for (i=0; i<n; ++i)
{
scanf("%d",&v[i]);
gets(temp);
}
}
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,x,y,j,r;
char temp[50];
for (i=0; i<m; i++)
{
gets(temp); x=0; y=0; j=0;
while (temp[j]>='0' && temp[j]<='9')
x=x*10+temp[j++]-'0';
j++;
while (temp[j]>='0' && temp[j]<='9')
y=y*10+temp[j++]-'0';
x--; y--;
l=log[y-x+1];
r=minim(a[x][l],a[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;
}