Pagini recente » Cod sursa (job #779933) | Cod sursa (job #2221364) | Cod sursa (job #2012218) | Cod sursa (job #2097197) | Cod sursa (job #819344)
Cod sursa(job #819344)
#include<cstdio>
#define ll long long
using namespace std;
int n,m,x,y;
ll sum[250007],s[250007],a[250007],b[250007];
int caut (int st, int dr,ll k1,ll k2)
{
int med=0,last=0;
while (st<=dr)
{
med=(st+dr)/2;
if (sum[med]-k1>=s[med]-k2)
{
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main()
{
freopen("cuburi2.in","r",stdin);
freopen("cuburi2.out","w",stdout);
scanf("%d %d",&n,&m);
int i;
ll max=0,min=0,min2;
for (i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
max+=a[i];
}
//sume partiale
for (i=1;i<=n;++i)
{
sum[i]=sum[i-1]+a[i];
s[i]=max-sum[i];
}
for (i=1;i<=n;++i)
a[i]=a[i-1]+sum[i-1];
for (i=n;i>0;--i)
b[i]=b[i+1]+s[i];
for (i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
min=caut(x,y,sum[x-1],s[y]);
min2=(ll)a[min]-a[x]-sum[x-1]*(min-x)+b[min]-b[y]-s[y]*(y-min);
printf("%d ",min);
printf("%lld\n",min2);
}
}