Mai intai trebuie sa te autentifici.
Cod sursa(job #1620406)
Utilizator | Data | 29 februarie 2016 09:25:34 | |
---|---|---|---|
Problema | Range minimum query | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.73 kb |
#include <fstream>
#define LMAX 18
#define NMAX 100007
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int Dp[LMAX][NMAX];
int Lg[NMAX];
int n, m;
int main(){
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> Dp[0][i];
for(int i = 1; (1 << i) <= n; ++i)
for(int j = 1; j <= n - (1 << i) + 1; ++j)
Dp[i][j] = min(Dp[i - 1][j], Dp[i - 1][j + (1 << (i - 1))]);
Lg[1] = 0;
for(int i = 2; i <= n; ++i)
Lg[i] = Lg[i / 2] + 1;
while(m--){
int a, b;
cin >> a >> b;
int l = Lg[b - a + 1];
int Number = b - a + 1 - (1 << l);
cout << min(Dp[l][a], Dp[l][a + Number]) << "\n";
}
return 0;
}