Pagini recente » Cod sursa (job #1719068) | Cod sursa (job #2340315) | Cod sursa (job #2552346) | Cod sursa (job #2603464) | Cod sursa (job #1420515)
// RMQ < NlogN , 1>
// Memorie NlogN
/* RMQ[i][j] = minimul din intervalul [j, j+2^i) */
#include <fstream>
#include <algorithm>
#define LgMax 21
#define Nmax 100009
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N, Q, v[Nmax];
int lg[Nmax], RMQ[LgMax][Nmax], x, y;
void buildRMQ() {
for(int i = 2; i <= N; ++i) lg[i] = lg[i/2] + 1;
for(int j = 1; j <= N; ++j) RMQ[0][j]=v[j]; /* intervale de lungime 1 */
for(int i=1; (1<<i) <= N; ++i) /* 2^i lungimea intervaluui */
for(int j = 1; j <= N-(1<<i)+1; ++j) /*capatul stanga */
RMQ[i][j]= min ( RMQ[ i-1 ][ j ] , RMQ[ i-1 ][ j+(1<<(i-1)) ] );
}
int query(int& x, int& y) {
if(x > y)swap(x,y);
int i = lg[y-x+1];
return min( RMQ[i][x] , RMQ[i][y-(1<<i)+1] );
}
int main()
{
f >> N >> Q;
for(int i = 1; i <= N; ++i) f>> v[i];
buildRMQ();
for(int i = 1; i <= Q; ++i) {
f >> x >> y;
g<<query(x, y)<<'\n';
}
f.close();g.close();
return 0;
}