Pagini recente » Cod sursa (job #710963) | Cod sursa (job #387238) | Cod sursa (job #679263) | Cod sursa (job #1470178) | Cod sursa (job #3319554)
#include <bits/stdc++.h>
using namespace std;
long long sp[250005],spSp[250005],sum=0,nr,sumInitial[250005],solutie;
/// sp este suma partiala normala pe vectorul dat
///spSp este suma partiala de sume partiale
///sumInitial = 1*v[1] + 2*v[2] + ... + N*v[N]
long long x,y,valFinal;
long long check(long long i)
{
return (sumInitial[y] -sumInitial[x-1]) - (i*(sp[y]-sp[x-1])- 2* (spSp[i-1] - spSp[x-1]));
///formula determinata pt calcularea sumei din cerinta pt o anumita pozitie
}
int main()
{
ifstream cin("cuburi2.in");
ofstream cout("cuburi2.out");
long long N,M;
cin>>N>>M;
for(int i=1;i<=N;i++)
{
cin>>nr;
sumInitial[i]= sumInitial[i-1] + i*nr;
sp[i]= sp[i-1]+nr;
spSp[i]= spSp[i-1]+sp[i];
}
while(M--)
{
cin>>x>>y;
///caut binar pozitia buna
valFinal=LONG_MAX;
long long st=x,dr=y;
while(st<=dr)
{
long long m=(st+dr)/2;
// cout<<spSp[m-1]<<' '<<spSp[st-1]<<'\n';
long long val1=check(m);
// cout<<m<<' '<<val1<<' '<<(sumInitial[dr] -sumInitial[st-1]) - m*(sp[dr]-sp[st-1])<<'\n';
long long val2=check(m+1);
if(val1>val2)
{
st=m+1;
// valFinal=val2;
}
else
{
dr=m-1;
// valFinal=val1;
}
if(val1<valFinal)
{
valFinal=val1;
solutie=m;
}
}
cout<<solutie<<' '<<valFinal<<'\n';
}
return 0;
}