Pagini recente » Cod sursa (job #2958631) | Borderou de evaluare (job #1597847) | Cod sursa (job #1442782)
#include <fstream>
#include <cstring>
#include <deque>
using namespace std;
static const int MAXN = 100009;
static const int INF = 0x3F3F3F3F;
static const int MAXR = 300;
int n, m;
int v[MAXN];
int mr[MAXN];
int main()
{
int x, y;
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> n >> m;
for(int i = 1; i <= n; i++)
{
f >> v[i];
}
memset(mr, 0x3F, sizeof(mr));
deque<int> q;
for(int i = 1; i < MAXR && i <= n; i++)
{
while(!q.empty() && v[q.back()] > v[i])
{
q.pop_back();
}
q.push_back(i);
}
for(int i = MAXR; i <= n; i++)
{
while(!q.empty() && v[q.back()] > v[i])
{
q.pop_back();
}
q.push_back(i);
if(q.front() < i - MAXR + 1)
{
q.pop_front();
}
mr[i - MAXR + 1] = v[q.front()];
}
for(int i = 0; i < m; i++)
{
f >> x >> y;
int ans = INF;
int j;
for(j = x; j + MAXR - 1 <= y; j+= MAXR)
{
ans = min(ans, mr[j]);
}
for(; j <= y; j++)
{
ans = min(ans, v[j]);
}
g << ans << '\n';
}
f.close();
g.close();
return 0;
}