Pagini recente » Cod sursa (job #1301066) | Cod sursa (job #434824) | Cod sursa (job #843774) | Cod sursa (job #3274987) | Cod sursa (job #3132336)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
void buildRMQ(vector <int> v, int nrElemente, int RMQ[17][100001])
{
cout << "intru in build rmq";
for (int i = 0; i < nrElemente; i++)
{
RMQ[0][i] = v[i]; /// initializam prima linie a rmq ului cu valorile vectorului
}
for (int i = 1; i <= floor(log2(nrElemente)); i++)
{
for (int j = 0; j <nrElemente; j++)
{
RMQ[i][j] = min(RMQ[i-1][j], RMQ[i-1][j + int(pow(2,i))]); /// aplicam formula generala pentru restul termenilor
}
}
}
int main()
{
int nrElemente, nrIntrebari;
fin >> nrElemente >> nrIntrebari;
vector <int> v;
for (int i = 0; i < nrElemente; i++)
{
int element;
fin >> element;
v.push_back(element);
}
int RMQ [17][100001]; // face urat si nu ma lasa sa aloc atat de mult spatiu pentru un vector so what should i do??
buildRMQ(v, nrElemente, RMQ);
for (int i = 1; i < nrElemente; i++)
{
int capatSt, capatDr;
fin >> capatSt >> capatDr;
int p = __builtin_clz(capatDr - capatSt + 1);
cout << min(RMQ[p][capatSt], RMQ[p][capatDr - int(pow(2, p) + 1)]) << endl; // aplicam formula pentru a recupera minimul de pe
} // intervalul dorit
return 0;
}