Pagini recente » Borderou de evaluare (job #3366021) | Statistici Damian Cosmin (Cosmin1605) | Monitorul de evaluare | Atasamentele paginii Profil AlexandruINV | Cod sursa (job #3365622)
#include <fstream>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
const int LOG2n = 17; ///2^17 > 100000
int RMQ[LOG2n][MAXN]; ///RMQ[k][i]=minimul pe intervalul [i, i+2^k-1]
int V[MAXN];
int n,m;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int log2n(int n) ///calculeaza rapid log2(n)
{
return 31- __builtin_clz(n);
}
void citesteDate()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>V[i];
}
void construiesteSparseTable()
{
//baza=intervale de lungime 1
for (int i=1;i<=n;i++)
RMQ[0][i]=V[i];
int maxK = log2n(n);
for (int k=1;k<=maxK;k++)
{
int lungime=1<<k;
for (int i=1;i+lungime-1<=n;i++)
RMQ[k][i]=min(RMQ[k-1][i], RMQ[k-1][i+(1<<(k-1))]);
}
}
int query(int x, int y)
{
if (x>y)
swap(x, y);
int k=log2n(y-x+1);
return min(RMQ[k][x], RMQ[k][y-(1<<k)+1]);
}
void raspundeIntrebari()
{
int x, y;
for (int i=1;i<=m; i++)
{
fin>>x>>y;
fout<<query(x,y)<<'\n';
}
}
int main()
{
citesteDate();
construiesteSparseTable();
raspundeIntrebari();
fin.close();
fout.close();
return 0;
}