Pagini recente » Cod sursa (job #998563) | Cod sursa (job #2031398) | Cod sursa (job #1671638) | Cod sursa (job #2211557) | Cod sursa (job #1088281)
#include <iostream>
#include <fstream>
#define nmax 100005
#define mmax 1000005
#define logmax 20
#define inf (1<<30)
using namespace std;
int v[nmax], M[nmax][logmax];
int n, m, a, b;
int RMQ(int i, int j) {
int k = 0;
while((1<<(k+1))<=j-i+1) k++; //k = log_2 DIM
return min(M[i][k], M[j-(1<<k)+1][k]);
}
int main() {
ifstream f("rmq.in");
ofstream g("rmq.out");
f>>n>>m;
for(int i=1; i<=n; i++) f>>v[i];
for(int i=1; i<=n; i++) M[i][0] = v[i];
for(int j=1; (1<<j)<=n; j++)
for(int i=1; i<=n; i++) M[i][j] = inf;
for(int j=1; (1<<j)<=n; j++)
for(int i=1; i+(1<<j)-1<=n; i++)
//construiesc M[i][j], pe baza lui M[i][j-1] si M[i+2^(j-1)][j-1]
M[i][j] = min(M[i][j-1], M[i+(1<<(j-1))][j-1]);
for(int i=1; i<=m; i++) {
f>>a>>b;
g<<RMQ(a, b)<<"\n";
}
return 0;
}