Pagini recente » Cod sursa (job #1453115) | Cod sursa (job #1869633) | Cod sursa (job #958374) | Cod sursa (job #3290443) | Cod sursa (job #1332863)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("rmq.in");
ofstream os("rmq.out");
using VI = vector<int>;
using VVI = vector<VI>;
int n, m;
VI s, log2;
VVI r;
void Read();
void RMQ();
void Query();
int main()
{
Read();
RMQ();
Query();
is.close();
os.close();
return 0;
}
void RMQ()
{
log2 = VI(n + 1);
for ( int i = 2; i < n; ++i )
log2[i] = log2[i / 2] + 1;
r = VVI(n + 1, VI(20));
for ( int i = 0; i <= n; ++i )
r[i][0] = i;
for ( int j = 1; ( 1 << j ) <= n; ++j )
for ( int i = 1; i + ( 1 << j ) - 1 <= n; ++i )
if ( s[r[i][j - 1]] < s[r[i + ( 1 << (j - 1) )][j - 1]] )
r[i][j] = r[i][j - 1];
else
r[i][j] = r[i + ( 1 << (j - 1) )][j - 1];
}
void Read()
{
is >> n >> m;
s = VI(n + 1);
for ( int i = 1; i <= n; ++i )
is >> s[i];
}
void Query()
{
int x, y, val;
while ( m-- )
{
is >> x >> y;
val = log2[y - x + 1];
os << min(s[r[x][val]], s[r[y - (1 << val) + 1][val]]) << "\n";
}
}