Pagini recente » Cod sursa (job #1948419) | Cod sursa (job #1866842) | Cod sursa (job #2297974) | Cod sursa (job #685731) | Cod sursa (job #2550259)
#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;
exponent[0] = -1;
///Initial o sa precalculam puterile lui 2. Astfel, exponent[i] = x, unde 2^x = i;
for(i=1;i<=n;i++)
{
fin>>rmq[0][i];
exponent[i] = exponent[i>>1] +1;
}
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 - (1<<i)+1 ;j++)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + (1<<(i-1)) ] );
///Construirea rmq se va face prin urmatoarea formula rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j + 2^(i-1)]);
}
///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]; ///aflam acel j-cea mai mare putere a lui 2 mai mica sau egala cu lungimea secventei
p = (1<<j); /// este echivalent cu (p = 2^j)
fout<<min(rmq[j][a], rmq[j][b-p+1])<<"\n";
}
return 0;
}