Pagini recente » Cod sursa (job #1765409) | Cod sursa (job #755641) | Cod sursa (job #1840254) | Cod sursa (job #1769451) | Cod sursa (job #2305948)
#include <iostream>
#include <stdio.h>
using namespace std;
#define NMAX 100000
#define LOGMAX 20
int v [ NMAX + 1 ] ;
int rmq [ NMAX + 1 ] [ LOGMAX ] ;
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 log (int n ) {
int r, p ;
r = 1 ;
p = 0 ;
while (r < n ) {
r *= 2 ;
p++;
}
return (p-1) ;
}
int main() {
FILE *fin, *fout ;
fin = fopen ("rmq.in", "r" ) ;
fout = fopen ("rmq.out", "w" ) ;
int n, i, m, j, k, a, b ;
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", &a, &b ) ;
b--, a--;
k = log (b-a+1) ;
if (v[rmq[a][k]] <= v[rmq[b-(1<<k)+1][k]] )
fprintf (fout, "%d\n", v[rmq[a][k]]) ;
else
fprintf (fout, "%d\n", v[rmq[b-(1<<k)+1][k]]) ;
}
return 0;
}