Pagini recente » Cod sursa (job #261702) | Cod sursa (job #2180666) | Cod sursa (job #1373252) | Cod sursa (job #3177640) | Cod sursa (job #2679423)
#include<bits/stdc++.h>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N, M;
vector<int> v; /// input
vector<int> lg; /// log2 values
vector<vector<int>> spt; /// sparse table
void rd()
{
f>>N>>M;
lg.resize(N+1, 0);
v.resize(N, 0);
spt.resize(N, vector<int>(lg[N] + 1, 0));
for(int i=0; i<N; i++)
f>>v[i];
}
int query(int i, int j)
{
int k = lg[j - i + 1];
return min(v[spt[i][k]], v[spt[j + 1 - (1<<k)][k]]);
}
void init()
{
for(int i=2; i<=N; i++)
{
lg[i] = lg[i - 1];
lg[i] += (i % (1 << lg[i-1]) == 0);
}
for(int i=0; i<N; i++)
spt[i][0] = i;
for(int j=1; (1<<j)<=N; j++)
for(int i=0; i + (1<<j) - 1 < N; i++)
if(v[spt[i][j-1]] < v[spt[i + (1<<(j-1))][j-1]])
spt[i][j] = spt[i][j-1];
else
spt[i][j] = spt[i + (1<<(j-1))][j-1];
}
void RMQ()
{
init();
for(int i=0; i<M; i++)
{
int l, r;
f>>l>>r;
///g<<query(l, r)<<'\n';
g<<query(l-1, r-1)<<'\n';
}
}
int main ()
{
rd();
RMQ();
f.close();
g.close();
return 0;
}