Pagini recente » Cod sursa (job #2870779) | Cod sursa (job #2174710) | Cod sursa (job #1316784) | Cod sursa (job #2668314) | Cod sursa (job #2360384)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int n, m, p, i, j, c, k;
int v[100005], l[100005], rmq[100005][20];
int main(){
fin >> n >> m;
for (i=1; i<=n; i++){
fin >> v[i];
}
for (i=2; i<=n; i++){
l[i] = l[i/2] + 1; //l[i] = parte intreaga din logaritm in baza 2 din i
}
for (i=1; i<=n; i++){ //initializez rmq pentru intervale de lungime 1
rmq[i][0] = i;
}
//rmq[i][j] = indicele celei mai mici valori din intervalul care incepe pe pozitia i si are lungime 2^j
for (j=1; (1<<j)<=n; j++){
for (i=1; i+(1<<j)-1<=n; i++){
if (v[rmq[i][j-1]] < v[rmq[i+(1<<(j-1))][j-1]]){
rmq[i][j] = rmq[i][j-1];
}
else{
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
}
}
for (c=1; c<=m; c++){
fin >> i >> j;
k = l[j-i+1]; //impart segmentul dat in 2 bucati
if (v[rmq[i][k]] <= v[rmq[j-(1<<k)+1][k]]){
fout << v[rmq[i][k]] << "\n";
}
else{
fout << v[rmq[j-(1<<k)+1][k]] << "\n";
}
}
}
//recapitulare