Pagini recente » Cod sursa (job #1045279) | Cod sursa (job #3166296) | Cod sursa (job #1653710) | Cod sursa (job #2945785) | Cod sursa (job #2570441)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, i, exp, log[100002], d[10][100002], a, b;
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>d[0][i];
/// d[exp][i] = minimul din secventa ce incepe pe pozitia i si are lungimea 2 la exp
/// d[0][i] -> secventa de lungime unu, adica chiar elementul i
/// partea intreaga a logaritmului in baza a 2 a fiecarei lungimi posibile de interval
log[1] = 0;
for(i=2;i<=n;i++){
log[i] = log[i-1];
if((1<<(log[i]+1)) == i)
log[i]++;
}
for(exp=1;exp<=log[n];exp++){
int lung = (1<<exp);
for(i=1;i<= n;i++){
d[exp][i] = d[exp-1][i]; /// minimul din prima jumatate a subsecventei
if(i+lung/2 <= n)
d[exp][i] = min(d[exp][i], d[exp-1][i+lung/2]);
}
}
for(i=1;i<=m;i++){
fin>>a>>b;
int lungime = b-a+1;
exp = log[lungime];
fout<<min(d[exp][a], d[exp][b-(1<<exp)+1])<<"\n";
}
return 0;
}