Pagini recente » Cod sursa (job #855040) | Cod sursa (job #248947) | Cod sursa (job #2594558) | Cod sursa (job #241668) | Cod sursa (job #635066)
Cod sursa(job #635066)
/*
rmq[x][y]=min(x->x+2^y-1);
termeni=y-x+1
l=log(termeni)
k=y-2^l+1
*/
#include<fstream>
using namespace std;
int n,m,rmq[100100][18],log_2[100100];
void make_rmq() {
int i,j,lp;
for(j=1;(1<<j)<=n;j++)
for(i=1;i+(1<<j)-1<=n;i++) {
lp=1<<(j-1);
rmq[i][j]=min(rmq[i][j-1],rmq[i+lp][j-1]);
}
}
int main() {
int i,x,y,termeni,k,lp;
ifstream in("rmq.in");
ofstream out("rmq.out");
in>>n>>m;
for(i=1;i<=n;in>>rmq[i++][0]);
for(i=2;i<=n;i++)
log_2[i]=log_2[i/2]+1;
make_rmq();
for(i=0;i<m;i++) {
in>>x>>y;
termeni=y-x+1;
lp=log_2[termeni];
k=y-(1<<lp)+1;
out<<min(rmq[x][lp],rmq[k][lp])<<'\n';
}
in.close();
out.close();
return 0;
}