Pagini recente » Cod sursa (job #1257003) | Cod sursa (job #372758) | Cod sursa (job #1439318) | Cod sursa (job #108919) | Cod sursa (job #568917)
Cod sursa(job #568917)
#include<cstdio>
#include<cmath>
#include<algorithm>
#define Nmax 100001
#define Lmax 17
using namespace std;
int N,M;
int d[Lmax][Nmax];
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i)
scanf("%d",&d[0][i]);
for(int lung=1; 1<<lung <=N; lung++) // toate secventele de lungime 2^lung
for(int start=1; start +(1<<(lung-1)) <= N; ++start) //ce incep din "start"
d[lung][start] = min ( d[lung-1][start] , //lungime 2^lung/2 ce incepe din partea stanga
d[lung-1][start + (1<< (lung-1))]); //lungime 2^lung/2 ce se termina in partea dreapta
for(int i=1;i<=M;++i){
int x,y;
scanf("%d%d",&x,&y);
int k = (int)log2(y-x+1); // cea mai mare lungime putere a lui 2 mai mica decat lungimea intervalului
int sol = min ( d[k][x] , // lungime 2^k ce incepe din x
d[k][y- (1<<k) +1] ); //lungimime 2^k ce se termina in y
printf("%d\n",sol);
}
return 0;
}