Pagini recente » Cod sursa (job #2631271) | Cod sursa (job #1943714) | Cod sursa (job #1671097) | Cod sursa (job #1513858) | Cod sursa (job #1761286)
#include <stdio.h>
#include <math.h>
#define min(a,b) ((a)<(b) ? (a) : (b))
const int buff_size=4096;
char buff[buff_size];
int _i=buff_size;
int next_int(FILE * in)
{
char x,y;
int z=0;
if (_i==buff_size)
y=fread(buff,buff_size,1,in),_i=0;
x=1;
while (x<48 || x> 57)
{
x=buff[_i];
_i++;
if (_i==buff_size)
{
y=fread(buff,buff_size,1,in);
_i=0;
}
}
while (x>=48 && x<=57)
{
z=(z<<1)+(z<<3)+x-48;
x=buff[_i];
_i++;
if (_i==buff_size)
{
y=fread(buff,buff_size,1,in);
_i=0;
}
}
return z;
}
int a[100009],m[100001][18],n,mr,i,j,k,p[20],lg[100001];
int main(int argc, char const *argv[])
{
FILE * in = fopen("rmq.in","r");
FILE * out= fopen("rmq.out","w");
n=next_int(in);
mr=next_int(in);
for (i=0;i<n;++i)
a[i]=next_int(in);
for (i=0;i<n;++i)
m[i][0]=i;
p[0]=1;
for (i=1;i<18;++i)
p[i]=p[i-1]*2;
lg[1]=0;
for (i=2,j=1;i<=n;++i)
if (i>=p[j])
lg[i]=j++; else
lg[i]=j-1;
for (j=1;p[j]<=n;++j)
for (i=0;i+p[j]-1<n;++i)
if (a[m[i][j-1]]<a[m[i+p[j-1]][j-1]])
m[i][j]=m[i][j-1]; else
m[i][j]=m[i+p[j-1]][j-1];
while (mr--)
{
i=next_int(in)-1;
j=next_int(in)-1;
k=lg[j-i+1];
fprintf(out,"%d\n",min(a[m[i][k]],a[m[j-p[k]+1][k]]));
}
fclose(in);
fclose(out);
return 0;
}