Pagini recente » Cod sursa (job #640302) | Cod sursa (job #952141) | Cod sursa (job #2373609) | Cod sursa (job #2724334) | Cod sursa (job #2527728)
//RMQ(Range minimum query)
//Complexitate: O(N log N + M)
#include<bits/stdc++.h>
#define min(x,y) ((x<y) ? x:y)
using namespace std;
ifstream f("rmq.in"); ofstream g("rmq.out");
int n,m,lg[100005],A[20][100005];
int main()
{ f>>n>>m;
for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1; /// precalculam log i pentru a il putea accesa ulterior in O(1)
for(int i=1;i<=n;i++)
f>>A[0][i]; ///citim elementele vectorului care reprezinta prima linie a matricei ce retine dinamica
for(int i=1;i<=lg[n];i++)
for(int j=1;j<=n-(1<<(i-1));j++)
A[i][j]=min(A[i-1][j],A[i-1][j+(1<<(i-1))]); ///precalculam matricea cu ajutorul recurentei obtinute
for(int x,y,k,i=1;i<=m;i++)
{ f>>x>>y; /// citim x si y, capetele intervalului pe care facem interogarea
k=lg[y-x+1]; ///aflam k in O(1)
g<<min(A[k][x],A[k][y-(1<<k)+1])<<'\n'; ///afisam minimul pe intervalul [x,y]
}
g.close(); return 0;
}