Pagini recente » Cod sursa (job #1077101) | Cod sursa (job #3205403) | Cod sursa (job #1389053) | Cod sursa (job #2368908) | Cod sursa (job #2120395)
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int N = 100002, L = 18;
int rmq[L][N], lg[N], put[L], x, y;
void process(int n){
lg[1] = 0;
put[0] = 1;
for(int i=2;i<=n;i++)
lg[i] = lg[i/2] + 1;
for(int i=1;i<=L;i++)
put[i] = put[i-1] * 2;
for(int i=1;put[i] <= n;i++)
for(int j=1;j<=n-put[i]+1;j++)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+put[i-1]]);
}
int query(){
int len = y - x + 1, log, dist;
log = lg[len];
dist = len - put[log];
return min(rmq[log][x], rmq[log][x+dist]);
}
int main()
{
int n,m;
in>>n>>m;
for(int i=1;i<=n;i++)
in>>rmq[0][i];
process(n);
for(int i=1;i<=m;i++){
in>>x>>y;
out<<query()<<"\n";
}
in.close();
out.close();
return 0;
}