Pagini recente » Cod sursa (job #667544) | Cod sursa (job #1039063) | Cod sursa (job #1777113) | Cod sursa (job #2034660) | Cod sursa (job #1493344)
#include <fstream>
#include <string>
using namespace std;
int a[100010];
int m, c, N, index;
int M[31][1000010];
void rmq(){
for (int i = 0; i < N; ++i)
M[0][i] = i;
for (int j = 1; (1 << j) <= N; ++j)
for (int i = 0; i + (1 << j) - 1 < N; ++i)
if (a[M[j - 1][i]] < a[M[j - 1][i + (1 << (j - 1))]])
M[j][i] = M[j-1][i];
else M[j][i] = M[j - 1][i + (1 << (j - 1))];
}
int main(){
ifstream f("rmq.in");
ofstream of("rmq.out");
string s;
getline(f, s);
int nr, j;
nr = 0;
j = 0;
while (s[j] != ' '){
nr = nr * 10 + s[j] - '0';
++j;
}
N = nr;
++j;
nr = 0;
while (j < s.size()){
nr = nr * 10 + s[j] - '0';
++j;
}
m = nr;
int k, pow;
for (int i = 0; i < N; ++i){
j = 0; nr = 0;
getline(f, s);
while (j<s.size()){
nr = nr * 10 + s[j] - '0';
++j;
}
a[i] = nr;
}
rmq();
for (int i = 0; i < m; ++i){
k = 0; pow = 1;
j = 0; nr = 0;
getline(f, s);
while (s[j] != ' '){
nr = nr * 10 + s[j] - '0';
++j;
}
c = nr;
++j;
nr = 0;
while (j<s.size()){
nr = nr * 10 + s[j] - '0';
++j;
}
N = nr;
--c;
--N;
if (N < c){
N ^= c;
c ^= N;
N ^= c;
}
while (pow <= N - c + 1){ pow <<= 1; ++k; }
--k;
pow >>= 1;
index = (a[M[k][c]] <= a[M[k][N - pow + 1]]) ? M[k][c] : M[k][N - pow + 1];
of << a[index] << "\n";
}
return 0;
}