Pagini recente » Cod sursa (job #3242119) | Cod sursa (job #3214305) | Cod sursa (job #2425062) | Cod sursa (job #1456106) | Cod sursa (job #2543737)
#include <fstream>
#define K 100003
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m,i,j,x,y,lg,exponent,e,d[K][20],puteri[K];
///puteri[i] = exponentul celei mai apropiate puteri de 2 <= i
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>d[0][i];
for(i=2;i<=n;i++)
puteri[i]=1+puteri[i/2];
lg=puteri[n];
for(e=1;e<=lg;e++)
for(i=1;i<=n;i++){
d[e][i]=d[e-1][i];
if(i+(1<<(e-1)) <= n)
d[e][i]=min(d[e][i], d[e-1][i+(1<<(e-1))]);
}
/** d[e][i] = minimul dintr o secventa inceputa pe pozitia i de lungime 2^e
minimul pe o secv de lg 2^e se obtine din cele 2 secv de lg 2^(e-1) de deasupra ei */
for(;m--;){
fin>>x>>y;
lg=y-x+1;
exponent=puteri[lg];
fout<<min(d[exponent][x],d[exponent][y-(1<<exponent)+1])<<"\n";
} return 0;
/** minimul pe [x,y] este continut ori in secventa de lungime 2^exponent inceputa la poz x
ori terminata la poz y (tot de lungime 2^exponent); exponent fiind cea mai apropiata putere
de 2 <= lg => cele 2 secvente sigur se intersecteaza (prima secv trece de jumatatea intervalului)*/
}