Pagini recente » Cod sursa (job #998943) | Cod sursa (job #1030738) | Istoria paginii utilizator/valiarhiva | Cod sursa (job #1768638) | Cod sursa (job #2273757)
#include <cstdio>
#include <cmath>
const int VM = 25 * 10e4 ;
const int R(30) ;
int v[VM] ;
long long st[VM], dr[VM], mst[VM], mdr[VM] ;
inline int solve(int a, int b) {
int poz(a), step(1 << R) ;
while (step) {
if (poz + step <= b && st[poz + step - 1] - st[a - 1] < st[b] - st[poz + step - 1])
poz += step;
step >>= 1 ;
}
return poz ;
}
int main()
{
freopen("cuburi2.in","r",stdin) ;
freopen("cuburi2.out","w",stdout) ;
int n, m, x, y ;
scanf("%d %d", &n, &m) ;
register int i ;
for (i = 1 ; i <= n ; ++ i) {
scanf("%d",&v[i]) ;
st[i] = st[i - 1] + v[i] ;
mdr[i] = mdr[i - 1] + st[i - 1] ;
}
for (i = n ; i >= 1 ; -- i) {
dr[i] = dr[i + 1] + v[i] ;
mst[i] = mst[i + 1] + dr[i + 1] ;
}
for (i = 1 ; i <= m ; ++ i) {
scanf("%d %d", &x, &y) ;
int turn(solve(x, y)) ;
long long ans(0) ;
ans += mdr[turn] - mdr[x] - st[x - 1] * (turn - x) ;
ans += mst[turn] - mst[y] - dr[y + 1] * (y - turn) ;
printf("%d %lld\n", turn, ans) ;
}
return 0;
}