Pagini recente » Cod sursa (job #2340965) | Cod sursa (job #3243939) | Cod sursa (job #1769190) | Cod sursa (job #2157246) | Cod sursa (job #600232)
Cod sursa(job #600232)
#include <stdio.h>
#include <math.h>
#define MAX 100001
using namespace std;
long maxj,i,j,N,Mnr,sir[MAX],M[MAX][20];
int k;
int power (int x, int p)
{
int rez=1;
for (; p>=1; p--) rez*=x;
return rez;
}
int power2 (int p)
{
int rez=1;
for (; p>=2; p-=2) rez*=4;
for (; p>=1; p--) rez*=2;
return rez;
}
int logaritm2 (long x)
{
int rez=0;
while (power2(rez+1)<=x) rez++;
return rez;
}
int minsir (int x, int y)
{
if (sir[x]<sir[y]) return x;
else return y;
}
int RMQ (long x, long y)
{
k=logaritm2(y-x+1);
return sir[minsir(M[x][k],M[y-power2(k)+1][k])];
}
int main ()
{
FILE *f, *g;
f=fopen("rmq.in", "r");
g=fopen("rmq.out", "w");
fscanf(f, "%d %d", &N, &Mnr);
for (i=1; i<=N; i++) {fscanf(f, "%d", &sir[i]); M[i][0]=i;}
maxj=logaritm2(N);
for (j=1; j<=maxj; j++)
for (i=1; i+power2(j)-1<=N; i++)
M[i][j]=minsir(M[i][j-1], M[i+power2(j-1)][j-1]);
for (; Mnr>=1; Mnr--)
{
fscanf(f, "%d %d", &i,&j);
fprintf(g, "%d\n", RMQ(i,j));
}
fclose(f); fclose(g);
return 0;
}