Pagini recente » Cod sursa (job #3255186) | Cod sursa (job #2430210) | Cod sursa (job #3229114) | Cod sursa (job #160254) | Cod sursa (job #2334209)
#include <fstream>
#define DIM 250002
using namespace std;
long long sum1[DIM],sum2[DIM],st[DIM],dr[DIM];
long long GetCost(int i,int j,int pos) {
long long sum=0;
sum=st[pos]-st[i-1]-(pos-i+1)*sum1[i-1];
sum+=dr[pos]-dr[j+1]-(j-pos+1)*sum2[j+1];
return sum;
}
int main()
{ int n,m,i,j,pos;long long l,r,mid,sol,x,c1,c2,c3;
ifstream f("cuburi2.in");
ofstream g("cuburi2.out");
f>>n>>m;
for (i=1;i<=n;++i) {
f>>x;
sum1[i]=sum1[i-1]+x,st[i]=st[i-1]+sum1[i-1];
}
for (i=n;i>=1;--i)
sum2[i]=sum2[i+1]+sum1[i]-sum1[i-1],dr[i]=dr[i+1]+sum2[i+1];
for (int q=1;q<=m;++q) {
f>>i>>j;
l=i,r=j;
while (l<=r) {
mid=(l+r)/2;
if (mid==l || mid==r) {
if (GetCost(i,j,l)<GetCost(i,j,r)) pos=l,sol=GetCost(i,j,l);
else pos=r,sol=GetCost(i,j,r);
break;
}
c1=GetCost(i,j,mid-1);
c2=GetCost(i,j,mid);
c3=GetCost(i,j,mid+1);
if (c1>=c2 && c2>=c3) l=mid+1;
else if (c1<=c2 && c2<=c3) r=mid-1;
else {
pos=mid;
sol=c2;
break;
}
}
g<<pos<<" "<<sol<<'\n';
}
return 0;
}