Pagini recente » Cod sursa (job #1886044) | Cod sursa (job #1535906) | Cod sursa (job #732484) | Cod sursa (job #2833048) | Cod sursa (job #2300847)
//sqrt solution
#include <iostream>
#include <fstream>
#define INF (1<<28)
#define Nmax 100005
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, q, rt, v[Nmax];
int sqr[Nmax];
int cnt=0, x, y;
void read()
{
f >> n >> q;
for (int i = 1; i <= n; i++)
{
f >> v[i];
sqr[i] = INF;
}
}
int findRoot(int n)
{
int rt=0;
while(rt*rt<=n) rt++;
rt--;
return rt;
}
void build()
{
for (int i = 1; i <= n; i++)
{
int j = i;
cnt++;
for (; i <= min(j+rt-1, n); i++)
{
sqr[cnt]=min(sqr[cnt], v[i]);
}
i--;
}
}
int query(int x, int y)
{
int j=1, ans=INF;
for (; rt*j < x; j++);
int X=min(y, j*rt);
j++;
for (; j*rt <=y; j++)
ans=min(ans, sqr[j]);
int Y=max(rt*(j-1), x);
for (int i = x; i <= X; i++) ans=min(ans, v[i]);
for (int i = Y; i <= y; i++) ans=min(ans, v[i]);
return ans;
}
int main()
{
read();
rt=findRoot(n);
build();
while(q--)
{
f >> x >> y;
g << query(x, y) << '\n';
}
return 0;
}