Pagini recente » Cod sursa (job #1198127) | Cod sursa (job #2767381) | Cod sursa (job #1183893) | Cod sursa (job #3187713) | Cod sursa (job #1470605)
#include <iostream>
#include <fstream>
#define N 100005
#define logN 20
using namespace std;
int a[logN][N],n,m;
fstream f,g;
int main()
{
int i, j, x, y, putere;
f.open("rmq.in",ios::in);
g.open("rmq.out",ios::out);
f>>n>>m;
for ( i = 1 ; i <= n ; i++)
f>>a[0][i];
// facem matricea
// a[i][j] = min ( a[i] ...., a[i + 2^j -1 ] )// vect intial
// a[i][j] = min ( a[i-1][j], a[i-1][j+2^(i-1)] )
for (i = 1 ; (1<<i) <= n ; i++ )
for (j = 1 ; j + (1<<i) - 1 <=n ; j++ )
a[i][j] = min ( a[i-1][j], a[i-1][j + (1<<(i-1)) ]);
// facem interogarile
// cautam cea mai mare put a lui 2 a.i sa fie inclusa in lungimea intervalului
// ne ducem pe coloana corespunzatoare matricei
// sol = min ( a[k][x], a[k][y-2^k + 1]
for (i = 1 ; i <= m ;i++)
{
f>>x>>y;
putere = 0;
while ( (1<<(putere +1 ) ) <= y-x)
putere ++;
g<<min(a[putere][x], a[putere][y - (1<<putere) + 1])<<"\n";
}
}