Pagini recente » Cod sursa (job #2878947) | Cod sursa (job #2789293) | Diferente pentru implica-te/arhiva-educationala intre reviziile 223 si 35 | Cod sursa (job #3258878) | Cod sursa (job #2639949)
/*https://www.topcoder.com/community/competitive-programming/tutorials/range-minimum-query-and-lowest-common-ancestor/*/
#include <iostream>
#include <fstream>
#include <math.h>
#define MAX 100005
#define logMax 16
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int A[MAX], N, logN;
int M[MAX+1][logMax+1];
int Q; // Q = M(din cerinta = nr de intrebari = queries)
void read(int &N, int &Q, int v[]){
f>>N>>Q;
for(int i=1; i<=N; i++)
f>>v[i];
}
void preprocessing(int M[][logMax+1]){
for(int i=1; i<=N; i++)
M[i][0] = i;
for(int j=1; 1 << j <=N; j++)
for(int i=0; i + (1<<j) - 1 <=N; i++)
if(A[M[i][j-1]] < A[M[i + (1 << (j-1))][j-1]])
M[i][j] = M[i][j-1];
else
M[i][j] = M[i + (1 << (j-1))][j-1];
}
int Query(int i, int j){
int k = int(log2(j-i+1));
if(A[M[i][k]] < A[M[j-(1<<k)+1][k]])
return A[M[i][k]];
else
return A[M[j-(1<<k)+1][k]];
}
int main()
{
read(N,Q,A);
logN = int(log2(N));
preprocessing(M);
int x,y;
for(int i=1; i<=Q; i++){
f>>x>>y;
g<<Query(x,y)<<"\n";
}
}