Pagini recente » Cod sursa (job #555301) | Cod sursa (job #1803762) | Cod sursa (job #478311) | Cod sursa (job #3178756) | Cod sursa (job #2543761)
#include <iostream>
#include <fstream>
using namespace std;
std::ifstream f("rmq.in");
std::ofstream g("rmq.out");
const int NMAX = 100005;
int n,query,l[NMAX],rmq[20][NMAX],x,y;
int main(){
f >> n >> query;
for(int i = 1;i <= n;++i)
f >> rmq[0][i];
//calculez L
l[1] = 0;
for(int i = 2;i <= n;++i)
l[i] = 1 + l[i / 2];
/// cout<<l[n]<<"\n";
// precalculez rmq
for(int i = 1;i <= l[n];++i){
for(int j = 1;j <= n;++j){
rmq[i][j] = rmq[i - 1][j];
int e = i - 1;
int ind = j + (1 << e);
if(ind <= n && rmq[i][j] > rmq[i - 1][ind])
rmq[i][j] = rmq[i - 1][ind];
}
}
/**
for (int i=0;i<=2;i++) {
for (int j=1;j<=n;j++)
cout<<rmq[i][j]<<" ";
cout<<"\n";
}
**/
//afisam in O(1) rezulattul la query-uri
while(query--){
f >> x >> y;
int len = (y - x + 1);
/// cout<<rmq[l[len]][x]<<" "<<rmq[l[len]][y - (1 << len) + 1]<<"\n";
/// cout<<l[len]<<"\n";
g << std::min(rmq[l[len]][x],rmq[l[len]][y - (1 << l[len]) + 1]) << '\n';
}
return 0;
}