Mai intai trebuie sa te autentifici.
Cod sursa(job #3366461)
| Utilizator | Data | 1 octombrie 2026 17:59:00 | |
|---|---|---|---|
| Problema | Range minimum query | Scor | 0 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.14 kb |
// rmq propriu-zis
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX=100005;
int a[NMAX][21];
// a[i][j] i-pozitia de inceput
// i+2^j-1 -pozitia de final
// a[i][j] -minimul pe interval
int n,queries;
vector<int> v,sol;
int power(int nr)
{
int p=1;
while(p*2<=nr) p*=2;
return p;
}
int main()
{
cin>>n>>queries;
v.resize(n);
for(int i=0;i<n;i++) {
cin>>v[i];
a[i][0]=v[i];
}
for(int i=0;i<n;i++)
for(int j=1;j<=20;j++) a[i][j]=INT_MAX;
for(int i=0;i<n;i++)
for(int j=1;j<=20;j++)
if(i+(1<<j)<=n)
a[i][j]=min(a[i][j-1],a[i+(1<<(j-1))][j-1]);
for(int i=0;i<queries;i++){
int left,right; cin>>left>>right; left--; right--;
int p=power(right-left+1);
int log=0;
while(p>1){
log++;
p>>=1;
}
int min1=a[left][log];
int min2=a[right-(1<<log)+1][log];
sol.push_back(min(min1,min2));
}
for(int x:sol) cout<<x<<'\n';
return 0;
}
