Pagini recente » Cod sursa (job #1630993) | Cod sursa (job #2132641) | Cod sursa (job #3156261) | Cod sursa (job #341639) | Cod sursa (job #1784763)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#define INF (1LL<<30)
#define DIM 100000
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m, k, pos=0, len, dx[1005], dy[1005], mn[1005], v[100005], buc[100005];
char sir[DIM];
void Read(int &x)
{
while (!isdigit(sir[pos]))
if (++pos == DIM) f.read(sir, DIM),pos=0;
x = 0;
while (isdigit(sir[pos]))
{
x = x * 10 + sir[pos] - 48;
if (++pos == DIM) f.read(sir, DIM), pos = 0;
}
}
void Seq()
{
int i, temp, beg, end;
beg = 1;
while (beg <= n)
{
end = beg + len - 1;
if (end > n) end = n;
k++; dx[k] = beg; dy[k] = end;
temp = INF;
for (i = beg; i <= end; i++)
{
temp = min(temp, v[i]);
buc[i] = k;
}
mn[k] = temp;
beg += len;
}
}
int Search(int i1, int i2)
{
int i, ans = INF , actx=buc[i1], acty=buc[i2];
if (actx != acty)
{
for (i = i1; i <= dy[actx]; i++)
ans = min(ans, v[i]);
for (i = dx[acty]; i <= i2; i++)
ans = min(ans, v[i]);
}
else
for (i = i1; i <= i2; i++)
ans = min(ans, v[i]);
for (i = actx + 1; i < acty; i++)
ans = min(ans, mn[i]);
return ans;
}
int main()
{
int i, x, y;
Read(n); Read(m);
len = (int)sqrt(n);
for (i = 1; i <= n; i++)
Read(v[i]);
Seq();
for (i = 1; i <= m; i++)
{
Read(x); Read(y);
g << Search(x, y)<<"\n";
}
return 0;
}