Pagini recente » Cod sursa (job #1173582) | Cod sursa (job #717985) | Cod sursa (job #1129246) | Cod sursa (job #3178892) | Cod sursa (job #923526)
Cod sursa(job #923526)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[100010],n,m,x,y;
int rmq[100010][20];
int log[100010];
int main()
{
fin>>n>>m;
int l = 0;
for(int i=1;i<=n;i++)
{
fin>>a[i];
rmq[i][0]=a[i];
if(i>1)
log[i] = 1 + log[i>>1];
}
//preprocesare
for(int j = 1; (1<<j) <= n; j++)
for(int i=1;i + (1<<j)-1<=n;i++)
rmq[i][j] = min( rmq[i][j-1], rmq[i + (1<<(j-1))][j-1]);
/**
desen :)
|________________|_________________|
i i+2^(j-1) i+2^j
\ _ _ _ _ _ _ _/ \ _ _ _ _ _ _ _ /
bloc de bloc de
lungime lungime
2^(j-1) 2^(j-1)
*/
//queryuri
for(int i=1;i<=m;i++)
{
fin>>x>>y;
l = log[y - x + 1];
fout<<min( rmq[x][l], rmq[y - (1<<l)+1][l])<<'\n';
}
/**
alt desen :D
|___________|_______________________|______________|
x y-2^L+1 x+2^L y
- - - - - - - - - - - - - - - - - --
- - - - - - - - - - - - - - - - - - - -
pentru queryuri se iau doua intervale care suprapuse
sa dea intervalul cautat
*/
fin.close();
fout.close();
return 0;
}