Pagini recente » Cod sursa (job #389721) | Cod sursa (job #823734) | Cod sursa (job #2904122) | Cod sursa (job #503624) | Cod sursa (job #1925837)
#include <cstdio>
using namespace std;
int n, m, a[250002];
long long s[250002], s1[250002], s2[250002], sd[250002], sp[250002];
int main()
{
freopen("cuburi2.in", "r", stdin);
freopen("cuburi2.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n ; ++i){
scanf("%d", &a[i]);
sd[i] = sd[i - 1] + a[i];
}
for(int i = n; i >= 1 ; --i)
sp[i] = sp[i + 1] + a[i];
for(int i = 1; i <= n ; ++i){
s1[i] = s1[i - 1] + sd[i - 1];
s[i] += s1[i];
}
for(int i = n; i >= 1 ; --i){
s2[i] += s2[i + 1] + sp[i + 1];
s[i] += s2[i];
}
int x, y;
for(int i = 1; i <= m ; ++i){
scanf("%d%d", &x, &y);
int st = x, dr = y, pos = x;
while(st <= dr){
int mij = (st + dr) / 2;
if(sd[mij - 1] - sd[x - 1] < sd[y] - sd[mij - 1]){
st = mij + 1;
pos = mij;
}
else dr = mij - 1;
}
long long Sol = s1[pos] - s1[x] - sd[x - 1] * (pos - x);
Sol = Sol + s2[pos] - s2[y] - sp[y + 1] * (y - pos);
printf("%d %lld\n", pos, Sol);
}
return 0;
}