Pagini recente » Rezultatele filtrării | Cod sursa (job #1508279) | Cod sursa (job #2627264) | Cod sursa (job #220617) | Cod sursa (job #2671308)
#include <fstream>
using namespace std;
const int NMAX = 100000;
int vec[1 + NMAX];
int aint[1 + 3 * NMAX];
void build(int index, int st, int dr)
{
if (st == dr)
{
aint[index] = vec[st];
return;
}
int mij = (st + dr) / 2;
build(2 * index, st, mij);
build(2 * index + 1, mij + 1, dr);
if (aint[2 * index] < aint[2 * index + 1])
{
aint[index] = aint[2 * index];
}
else
{
aint[index] = aint[2 * index + 1];
}
}
int query(int index, int stA, int drA, int stQ, int drQ)
{
if (stA == stQ && drA == drQ)
{
return aint[index];
}
int mij = (stA + drA) / 2;
if (drQ <= mij)
{
return query(2 * index, stA, mij, stQ, drQ);
}
else
{
if (stQ <= mij)
{
return min(query(2 * index, stA, mij, stQ, mij), query(2 * index + 1, mij + 1, drA, mij + 1, drQ));
}
else
{
return query(2 * index + 1, mij + 1, drA, stQ, drQ);
}
}
}
int main()
{
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m;
in >> n >> m;
for (int i = 1; i <= n; i++)
{
in >> vec[i];
}
build(1, 1, n);
for (int i = 1; i <= m; i++)
{
int st, dr;
in >> st >> dr;
out << query(1, 1, n, st, dr) << '\n';
}
return 0;
}