Pagini recente » Cod sursa (job #2301919) | Cod sursa (job #2282104) | Cod sursa (job #2039104) | Cod sursa (job #64863) | Cod sursa (job #1746418)
/*Se da un vector cu N elemente. Scrieti un program care raspunde la M intrebari de tipul
"Care este elementul minim din intervalul [x,y]?" Infoarena*/
#include <bits/stdc++.h>
using namespace std;
FILE*fin=fopen("rmq.in","r");
ofstream fout("rmq.out");
int n,m,d[20][100002],q;
int putere2(int n)
{
int p=1;
while(p<n)
p<<=1;
if(p>n) p>>=1;
return p;
}
void constructie_matrice()
{
int i,j,nr=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n-nr;j++)
d[i][j]=min(d[i-1][j],d[i-1][j+nr]);
nr<<=1;
}
/*& for(i=0;i<=m;i++)
{
for(j=1;j<=n&&d[i][j]!=0;j++)
fout<<d[i][j]<<" ";
fout<<'\n';
}*/
}
int putere(int a,int b)
{
int i=1,p=1;
for(i=1;i<=b;i++)
p<<=1;
return p;
}
int exponent(int x)
{
int k=0,p=1;
while(p<x)
{
p<<=1;
k++;
}
if(p>x) k--;
return k;
}
int determina(int x,int y)
{
int k=exponent(y-x);
return min(d[k][x],d[k][y-putere(2,k)+1]);
}
int main()
{
fscanf(fin,"%d%d",&n,&q);
int i;
for(i=1;i<=n;i++)
fscanf(fin,"%d",&d[0][i]);
m=putere2(n);
constructie_matrice();
int x,y;
for(i=1;i<=q;i++)
{
fscanf(fin,"%d%d",&x,&y);
fout<<determina(x,y)<<'\n';
}
return 0;
}