Pagini recente » Cod sursa (job #1633154) | Cod sursa (job #246066) | Cod sursa (job #364596) | Cod sursa (job #1231628) | Cod sursa (job #2258683)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=250000+5;
int n,q;
int h[N];
ll p[N],s[N];
ll sm[N];
inline ll gt(int st,int dr)
{
return sm[dr]-sm[st-1];
}
inline ll ask(int st,int pivot,int dr)
{
if(1<=st && st<=pivot && pivot<=dr && dr<=n)
{
ll dif1=s[st]-s[pivot+1],dif2=p[dr]-p[pivot-1];
return dif1-gt(st,pivot)*(long long)(n+1-pivot)+dif2-gt(pivot,dr)*(long long)pivot;
}
return (1LL<<60);
}
int F,S;
inline ll f(int id)
{
return ask(F,id,S);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
freopen("cuburi2.in","r",stdin);
freopen("cuburi2.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>h[i];
for(int i=1;i<=n;i++) sm[i]=sm[i-1]+h[i];
for(int i=1;i<=n;i++)
{
p[i]=p[i-1]+i*(long long)h[i];
}
for(int i=n;i>=1;i--)
{
s[i]=s[i+1]+(n+1-i)*(long long)h[i];
}
while(q--)
{
int lo,hi; cin>>lo>>hi;
F=lo;
S=hi;
int ans=lo;
while(lo<=hi)
{
int mid=(lo+hi)/2;
if(f(mid)<f(mid+1))
{
ans=mid;
hi=mid-1;
}
else
lo=mid+1;
}
cout<<ans<<" "<<f(ans)<<"\n";
}
return 0;
}