Pagini recente » Cod sursa (job #2676709) | Cod sursa (job #419607) | Cod sursa (job #885986) | Cod sursa (job #809313) | Cod sursa (job #2708451)
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("rmq.in") ;
ofstream cout("rmq.out") ;
/// range minimum query
/// programare dinamica, se tine o matrice unde m[f][e] este pozitia elem minim din intervalul f - e
/// initial consideram numai intervale de la f la f + 2^e, facem aceasta matrice
int m[100009][19], v[100009], p[30] ;
int pozmin(int st, int dr)
{
int l = 1 ;
while(p[l] <= dr - st + 1)
l ++ ;
l -- ;
return min(m[st][l], m[dr + 1 - p[l]][l]) ;
}
int main()
{
int n, q ;
ios_base::sync_with_stdio(false);
cout.tie(0) ;
cin.tie(0) ;
p[0] = 1 ;
for(int f = 1 ; f <= 20 ; f ++)
p[f] = p[f - 1] * 2 ;
cin >> n >> q ;
for(int f = 1 ; f <= n ; f ++)
cin >> v[f] ;
for(int f = 1 ; f <= n ; f ++)
{
m[f][0] = v[f] ;
/// incercam sa setam dr constant
int prev = f, l = 17 ;
for(int t = 1, dr = f + p[t] ; t <= l ; t ++, dr = f + p[t])
{
/// mergem inclusiv cu prev, exclusiv cu dr
m[f][t] = m[f][t - 1] ;
for(int aux = prev ; aux < dr && aux <= n ; aux ++)
m[f][t] = min(m[f][t], v[aux]) ;
prev = dr ;
}
}
for(int f = 1 ; f <= q ; f ++)
{
int a, b ;
cin >> a >> b ;
cout << pozmin(a, b) << '\n' ;
}
return 0;
}
/// 10
/// 12 14 7 1 6 8 9 10 2 4 -> 6