Pagini recente » Cod sursa (job #1903724) | Cod sursa (job #377725) | Cod sursa (job #1289233) | Cod sursa (job #1374776) | Cod sursa (job #3263288)
#include <fstream>
#include <cmath>
#include <stdlib.h>
#include <algorithm>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
/**
*
* RMQ (range minimum query) ;
* | | |
* i j numerele !
* pot sa apara
* de mai multe ori
*
* 10 elem.
*
* 1 5 8 3 9 14 17 7 20 9
*
*
* rmq[n][log n]
*
* i=1,n
* j=1,logn
* 1<<j
*
* rmq[i][0]=v[i]
* rmq[i][j]=min(rmq[i][j-1],rmq[i+2^j])
*
* rmq[i][j]=rez pe interval de la i de lungime 2^j
*
* [x,y] = rmq[x][l]
* rmq[y-l+1][l]
*
* p2[i]-> 2^j<=i, 2^j maxim
*
* p2[i-1] sau p2[i-1]*2
*
* Lowest common ancestor ( LCA ) :
*
* x , y
*
*
*
**/
int n,m,x,y,dif,l;
int v[100001];
int rmq[100001][20];
int p2[100001];
void create()
{
p2[1]=0;
for(int i=2;i<=n;i++)
{
p2[i]=p2[i-1];
if((1<<(p2[i]+1)) <=i)
p2[i]++;
}
for(int i=1;i<=n;i++)
{
rmq[i][0]=v[i];
}
for(int j=1;(1<<j)<=n;j++)
{
for(int i=1;i<=n-(1<<j)+1;i++)
{
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
}
}
int main(){
fin >> n >> m;
for(int i=1;i<=n;i++){
fin >> v[i];
fin.get();
}
create();
for(int q=1;q<=m;q++)
{
fin >> x >> y;
l=y-x+1;
fout << min(rmq[x][p2[l]],rmq[y-(1<<p2[l])+1][p2[l]]) << '\n';
}
return 0;
}