Pagini recente » Cod sursa (job #2931859) | Cod sursa (job #2999509) | Cod sursa (job #2303035) | Cod sursa (job #3138245) | Cod sursa (job #1820693)
#include <fstream>
using namespace std;
int v[200005], dp[40][200005], n, doi[40], m;
int minim (int a, int b)
{
if (a>b)
return b;
return a;
}
int main()
{
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
fin >> n >> m;
int i, put = 1, p = 0, a, b, dif, j;
while (put*2 < n)
{
put = put<<1;
++p;
}
doi[0] = 1;
for (i = 1; i<=p; ++i)
doi[i] = doi[i-1] << 1;
for (i = n+1; i<=2*n; ++i)
v[i] = dp[0][i] = 100001;
for (j = 1; j<=p; ++j)
for (i = n+1; i<=2*n; ++i)
dp[j][i] = 100001;
for (i = 1; i<=n; ++i)
{
fin >> v[i];
if (i>=2)
dp[0][i-1] = minim (v[i], v[i-1]);
}
dp[0][n] = v[n];
for (i = 1; i<=p; ++i)
for (j = 1; j<=n; ++j)
if (j+doi[i-1] <= n) dp[i][j] = minim(dp[i-1][j], dp[i-1][j+doi[i-1]]);
/*for (i = 1; i<=2*n; ++i)
{
for (j = 1; j<=p; ++j)
fout << dp[i][j] << " ";
fout << '\n';
}*/
for (i=0; i<m; ++i)
{
fin >> a >> b;
if (a == b)
fout << v[a] << '\n';
else {
dif = b-a+1;
put = 1;
p = 0;
while (put*2< dif)
{
put = put<<1;
++p;
}
fout << minim(dp[p][a], dp[p][b-put]) << '\n';}
}
return 0;
}