Pagini recente » Cod sursa (job #480981) | Cod sursa (job #873196) | Cod sursa (job #1215613) | Cod sursa (job #2427897) | Cod sursa (job #1660745)
#include <fstream>
#define DMAX 100010
using namespace std;
FILE * fin = fopen ("rmq.in", "r");
FILE * fout = fopen ("rmq.out", "w");
void citire();
void gen();
int query(int, int);
int putere2(int);
int n, m;
int v[DMAX], pd[DMAX][20];
int main()
{
int i, j, a, b;
citire();
gen();
/*
for (i=1; i<=n; i++)
{
for (j=0; (1<<j)<=n; j++)
fprintf(fout, "%d ", pd[i][j]);
fprintf(fout, "\n");
}
*/
for (i=1; i<=m; i++)
{
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d\n", query(a, b));
}
fclose(fin);
fclose(fout);
return 0;
}
void citire()
{
int i;
fscanf(fin, "%d %d", &n, &m);
for (i=1; i<=n; i++) // initializarea vectorului
fscanf(fin, "%d", &pd[i][0]);
}
void gen()
{
// luam de la intervalele mici pana la cele mari
int i, j;
for (j=1; (1<<j)<=n; j++)
for (i=1; i+(1<<j)-1<=n; i++)
{
if (pd[i][j-1]<pd[i+(1<<(j-1))][j-1])
pd[i][j]=pd[i][j-1];
else
pd[i][j]=pd[i+(1<<(j-1))][j-1];
}
}
int query(int a, int b)
{
int k;
k=putere2(b-a+1);
if (pd[a][k]<pd[b-(1<<k)+1][k])
return pd[a][k];
else
return pd[b-(1<<k)+1][k];
}
int putere2(int x)
{
int k;
for (k=0; (1<<k)<=x; k++);
return k-1;
}