Pagini recente » Cod sursa (job #2958513) | Cod sursa (job #2167192) | Cod sursa (job #2120723) | Cod sursa (job #2659269) | Cod sursa (job #2752306)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m;
int val[18][300003];
void Init()
{
for(int i=0; i<17; ++i)
for(int j=0; j<300000; ++j)
val[i][j]=100005; //o valoare foarte mare nu va influenta minimul
}
void Prep()
{
//val[i][j]=minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
for(int i=1, range=2; range<=n; ++i, range*=2) //range=2^i
for(int j=0; j<n; ++j)
val[i][j]=min(val[i-1][j], val[i-1][j+range/2]);
}
int minQuery(int x, int y)
{
int len=y-x+1;
int powmax=1, indexpow=0;
//caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
while(powmax*2<=len)
powmax*=2, indexpow++;
//intervalele se pot intrepatrunde pentru ca fac minimul si nu influenteaza
return min(val[indexpow][x], val[indexpow][y-powmax+1]);
}
int main()
{
int x,y;
fin>>n>>m;
Init();
for(int j=0; j<n; ++j)
fin>>val[0][j]; //prima linie e vectorul
Prep(); //preprocesare
for(int i=1;i<=m;++i)
{
fin>>x>>y; //capetele intervalului
fout<<minQuery(x-1,y-1)<<"\n"; //indexare de la 0 in matricea mea
}
return 0;
}