Pagini recente » Monitorul de evaluare | Cod sursa (job #1384331) | Cod sursa (job #2022267) | Cod sursa (job #478856) | Cod sursa (job #1792468)
///RMQ(Range minimum query) Complexitate: O(N log N + M)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
int N,M,x,y,k,i,j;
int D[20][Nmax],lg[Nmax];
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
f>>N>>M;
lg[1]=0; ///precalc log2(x)
for (i=2;i<=N;i++)
lg[i]=lg[i/2]+1;
///citim elementele vectorului care reprezinta prima linie a matricei ce retine dinamica
for (i=1;i<=N;i++)
f>>D[0][i];
///precalculam matricea cu ajutorul recurentei obtinute
for (i=1;i<=lg[N];i++)
for (j=1;j<=N-(1<<(i-1));j++)
D[i][j]=min(D[i-1][j],D[i-1][j+(1<<(i-1))]);
for (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(D[k][x],D[k][y-(1<<k)+1])<<"\n"; ///afisam minimul pe intervalul [x,y]
}
return 0;
}