Pagini recente » Cod sursa (job #2227375) | Cod sursa (job #211052) | Cod sursa (job #3127956) | Cod sursa (job #891314) | Cod sursa (job #2843353)
#include <bits/stdc++.h>
using namespace std;
ifstream in("cuburi2.in");
ofstream out("cuburi2.out");
long long n,m,sp[250005],v2[250005],v1[250005],a[250005];
long long S(int p,int x,int y)
{
if (p > y)
return 1000000000000000000;
long long s1,s2,s;
s1 = v1[x] - v1[p] - 1ll * (n - p + 1) * (sp[p - 1] - sp[x - 1]);
s2 = v2[y] - v2[p] - 1ll * p * (sp[y] - sp[p]);
s = s1 + s2;
return s;
}
int main()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
{
int x;
in >> x;
a[i] = x;
sp[i] = sp[i - 1] + x;
v2[i] = v2[i - 1] + 1ll * x * i;
}
for (int i = n; i >= 1; i--)
v1[i] = v1[i + 1] + 1ll * a[i] * (n - i + 1);
for (int i = 1; i <= m; i++)
{
int x,y;
in >> x >> y;
int p = x,pas = 1 << 18;
while (pas != 0)
{
if (p + pas <= y and sp[p + pas] - sp[x - 1] <= sp[y] - sp[p + pas])
p += pas;
pas /= 2;
}
long long s1 = S(p,x,y),s2 = S(p + 1,x,y);
if (s1 < s2)
out << p << ' ' << s1 << '\n';
else
out << p + 1 << ' ' << s2 << '\n';
}
return 0;
}
///la cb,ma uit ca sp[bucata din stanga] < sp[bucata din dreapta]