Pagini recente » Cod sursa (job #1092686) | Cod sursa (job #1414551) | Cod sursa (job #1478592) | Cod sursa (job #2031003) | Cod sursa (job #1476781)
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N,M;
int v[100010],lg[100010];
int rmq[100010][20];
// rmq[i][j]=pozitia minimului din intervalul [i,i + 2^j -1]
void preprocess();
int main()
{
f>>N>>M;
FOR (i,1,N) {
f>>v[i];
}
FOR (i,2,N) {
lg[i]=lg[i/2]+1;
}
preprocess();
FOR (i,1,M) {
int x,y;
f>>x>>y;
int dif=y-x+1;
if (v[rmq[x][lg[dif]]]<v[rmq[y-(1<<lg[dif])+1][lg[dif]]]) {
g<<v[rmq[x][lg[dif]]]<<'\n';
}
else {
g<<v[rmq[y-(1<<lg[dif])+1][lg[dif]]]<<'\n';
}
}
f.close();g.close();
return 0;
}
void preprocess() {
FOR (i,1,N) {
rmq[i][0]=i;
}
for (int k=1;(1<<k)<=N;++k) {
for (int i=1;i+(1<<k-1)<=N;++i) {
if (v[rmq[i][k-1]]<v[rmq[i+(1<<k-1)][k-1]]) {
rmq[i][k]=rmq[i][k-1];
}
else {
rmq[i][k]=rmq[i+(1<<k-1)][k-1];
}
}
}
}