Pagini recente » Cod sursa (job #2076308) | Cod sursa (job #2447058) | Cod sursa (job #1188835) | Cod sursa (job #1991835) | Cod sursa (job #2878946)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
vector <int> v, put2;
vector <vector <int>> minim;
int main ()
{
int marime, putere2;
int n, m, i, j, x, y;
f >> n >> m;
putere2 = 1, marime = 0;
while (putere2 < n)
putere2 *= 2, marime += 1;
v.resize (n + 1), put2.resize (n + 1);
minim.assign (marime + 1, vector <int> (n + 1));
put2[0] = 1;
for (i = 1; i <= n; i += 1)
{
f >> v[i];
if (put2[i - 1] * 2 < i)
put2[i] = put2[i - 1] * 2;
else
put2[i] = put2[i - 1];
}
for (i = 1; i <= n; i += 1)
minim[0][i] = v[i];
for (i = 1; i <= marime; i += 1)
{
for (j = 1; j <= n; j += 1)
{
minim[i][j] = minim[i - 1][j];
if (j + (1 << (i - 1)) <= n and minim[i - 1][j + (1 << (i - 1))] < minim[i][j])
minim[i][j] = minim[i - 1][j + (1 << (i - 1))];
}
}
for (i = 0; i <= marime; i += 1)
{
for (j = 1; j <= n; j += 1)
g << minim[i][j] << ' ';
g << '\n';
}
int dist, putere;
for (i = 1; i <= m; i += 1)
{
f >> x >> y;
dist = y - x;
putere = put2[dist];
g << min (minim[putere][x], minim[putere][y - putere]) << '\n';
}
return 0;
}