Pagini recente » Diferente pentru acmunibuc_2014/1 intre reviziile 50 si 51 | Cod sursa (job #2905902)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int logsize=17;
int n;
long sp[150002];
long mat[150002][17];
void citire()
{
int x,y;
fin>>n;
for (int i=1;i<=n;i++)
{
fin>>x>>mat[i][0];
sp[i]=sp[i-1]+x;
}
}
long long range_min(int st,int dr)
{
long long s=dr-st+1;
long long nr=0;
nr=(long long)log2(s);
return min(mat[st][nr],mat[dr-(1<<nr)+1][nr]);
}
void solve()
{
for (int j = 1; j <= logsize; j++)
for (int i = 1; i + (1<<j)-1<= n; i++)
mat[i][j] = min(mat[i][j - 1], mat[i + (1<<(j-1))][j - 1]);
int q;
fin>>q;
for (int i=1;i<=q;i++)
{
int left,right;
fin>>left>>right;
fout<<range_min(left,right)*(sp[right]-sp[left-1])<<'\n';
}
}
void solve_rmq()
{
int n,m;
fin>>n>>m;
for (int i=1;i<=n;i++)
fin>>mat[i][0];
for (int j = 1; j <= logsize; j++)
for (int i = 1; i + (1<<j)-1<= n; i++)
mat[i][j] = min(mat[i][j - 1], mat[i + (1<<(j-1))][j - 1]);
while(m--)
{
int st,dr;
fin>>st>>dr;
fout<<range_min(st,dr)<<'\n';
}
}
int main()
{
//citire();
// solve();
solve_rmq();
}