Pagini recente » Borderou de evaluare (job #2321873) | Cod sursa (job #2766088) | Cod sursa (job #2608926) | Cod sursa (job #1404756) | Cod sursa (job #3247878)
#include <bits/stdc++.h>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
const int N = 100010;
int n,q,L,RMQ[17][N];
int main()
{
f>>n>>q;
/// precalculez cate linii are matricea RMQ
for(int p=1;2*p<=n;p*=2,L++);
/// citesc prima linie care este chiar sirul initial
for(int i=1; i<=n; i++)
f>>RMQ[0][i];
/// construiesc matricea RMQ
for(int i=1,p=1,P=2; i<=L; i++,p*=2,P*=2)
for(int LO=1,MI=p+1,HI=P; HI<=n ; LO++,MI++,HI++)
RMQ[i][LO]=min(RMQ[i-1][LO],RMQ[i-1][MI]);
/// raspund la fiecare query in O(1)
for(; q; q--)
{
int st,dr,lung,lin,P;
f>>st>>dr;
lung=dr-st+1;
lin=31-__builtin_clz(lung);
P=1<<lin;
g<<min(RMQ[lin][st],RMQ[lin][dr-P+1])<<'\n';
}
return 0;
}