Pagini recente » Cod sursa (job #3282811) | Cod sursa (job #2687462) | Cod sursa (job #3239275) | Cod sursa (job #2252235) | Cod sursa (job #2550243)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100000;
int rmq[25][NMAX+5];
int exponent[NMAX+5];
int main()
{
int n, m, a, b, i, j, p;
fin>>n>>m;
int putere = 1;
///Initial o sa precalculam puterile lui 2. Astfel, exponent[i] = x, unde 2^x = i;
exponent[0] = -1;
for(i=1;i<=n;i++)
{
fin>>rmq[0][i];
exponent[i] = exponent[i-1];
if((i & (i-1)) == 0)
exponent[i]++;
}
p = exponent[n];
///Nr de linii al matricei noastre va fi reprezentat de p unde 2^p<=n;
for(i=1;i<=p;i++)
{
for(j=1;j<=n;j++)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + putere]);
///Construirea rmq se va face prin urmatoarea formula rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + 2^(j-1)]);
putere = putere * 2;
}
///Calculam query-urile dupa urmatoarea formula min(rmq[j][a], rmq[j][b- 2^(j) + 1]), unde 2^j <= b - a
for(i=1;i<=m;i++)
{
fin>>a>>b;
int l = b - a;
j = exponent[l];
p = 1<<j; /// este echivalent cu (p = 2^j)
fout<<min(rmq[j][a], rmq[j][b-p+1])<<"\n";
}
return 0;
}