Pagini recente » Istoria paginii runda/runda_de_verificare | Istoria paginii runda/0931011001/clasament | Cod sursa (job #1519510) | Cod sursa (job #1931088) | Cod sursa (job #2761651)
#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()
{
int p,i;
fin>>n>>m;
for (int i=1; i<=n; i++)
fin>>RMQ[0][i]; // numerele citite se afla pe prima linie
p=2; i=1;
while(p<=n){
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
p*=2;
i++;
}
for (int i=1; i<=m; i++){
fin>>stg>>dr;
fout<<minim(stg,dr)<<endl;
}
return 0;
}