Pagini recente » Cod sursa (job #2363497) | Cod sursa (job #2658864) | Cod sursa (job #310545) | Cod sursa (job #2496029) | Cod sursa (job #2646170)
#include <stdio.h>
using namespace std;
#include <algorithm>
#define NMAX 100000
#define POW2 17
int rmq[NMAX+1][POW2],v[NMAX+1];
void Rmq(int n){
int i,j;
for(i=0;i<n;i++)
rmq[i][0]=i;
for(j=1;(1<<j)<=n;j++){
for(i=0;i+(1<<j)-1<n;i++){
if(v[rmq[i][j-1]]<v[rmq[i+(1<<(j-1))][j-1]]){
rmq[i][j]=rmq[i][j-1];
}
else{
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
}
}
}
int power(int n){
int i,pow;
pow=1;
i=0;
while(pow<=n){
pow*=2;
i++;
}
return (i-1);
}
int main()
{
FILE *fin,*fout;
fin=fopen("rmq.in","r");
fout=fopen("rmq.out","w");
int n,m,i,j,k,rasp,x,y;
fscanf(fin,"%d%d",&n,&m);
for(i=0;i<n;i++){
fscanf(fin,"%d",&v[i]);
}
Rmq(n);
for(i=0;i<m;i++){
fscanf(fin,"%d%d",&x,&y);
x--,y--;
k=power(y-x+1);
fprintf(fout,"%d\n",std::min(v[rmq[x][k]],v[rmq[y-(1<<k)+1][k]]));
}
fclose(fin);
fclose(fout);
return 0;
}