Pagini recente » Cod sursa (job #2091024) | Cod sursa (job #3252817) | Cod sursa (job #1516202) | Cod sursa (job #3209665) | Cod sursa (job #401219)
Cod sursa(job #401219)
// Catalin Balan
// Mon Feb 22 17:13:02 EET 2010
// Infoarena.ro - Range Minimum Query
#include <cstdio>
#include <cstdlib>
using namespace std;
#define NMAX 100003
#define LOGMAX 18
#define CHUNK 8192
#define FIN "rmq.in"
#define FOUT "rmq.out"
#define min(a,b) (a<b?a:b)
char g_buf[CHUNK];
int g_p=CHUNK-1;
inline int get(FILE *f)
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
}
return x;
}
int a[NMAX][LOGMAX], lg[NMAX];
int n,m,len,k,x,y;
int main(int argv, char ** argc)
{
FILE *f = fopen(FIN, "r");
FILE *g = fopen(FOUT, "w");
n = get(f);
m = get(f);
a[1][0] = get(f);
lg[1] = 0;
for (int i = 2; i <= n; ++i)
{
a[i][0] = get(f);
lg[i] = lg[i>>1]+1;
}
for (int i = 1; i <= lg[n]; ++i)
{
len = 1<<i;
for (int j = 1; j <= n - len + 1; ++j)
{
a[j][i] = min(a[j][i-1], a[j+len/2][i-1]);
}
}
for (;m;--m)
{
x = get(f); y = get(f);
len = y-x+1;
k = lg[len];
fprintf(g,"%d\n", min( a[x][k], a[y - (1<<k) + 1 ][k] ) );
}
fclose(f);
fclose(g);
return EXIT_SUCCESS;
}