Pagini recente » Cod sursa (job #1485857) | Cod sursa (job #689123) | Cod sursa (job #2370696) | Cod sursa (job #452673) | Cod sursa (job #2761652)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int RMQ[20][100001],n,m,stg,dr;
int minim(int stg,int dr)
{
int k=0, pow=1;
while (pow*2<=dr-stg+1)
{
k++;
pow*=2; //put cauta cea mai mare putere a lui 2 mai mica decat lungimea intervalului dat
}
return min(RMQ[k][stg], RMQ[k][dr-pow+1]); //valoarea minima de pe linia aferenta
}
int main()
{
fin>>n>>m;
for (int i=1; i<=n; i++)
fin>>RMQ[0][i]; // numerele citite se afla pe prima linie
for (int i=1,p=2; p<=n; i++,p*=2){
for (int j=1; j<=n; j++)
RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+p/2]);
///generam tabelul si memoram pe urmatoarele linii minimele
} //mergand prin puteri ale lui 2
for (int i=1; i<=m; i++){
fin>>stg>>dr;
fout<<minim(stg,dr)<<endl;
}
return 0;
}