Pagini recente » Cod sursa (job #3207129) | Cod sursa (job #2020650) | Cod sursa (job #2379838) | Cod sursa (job #2861475) | Cod sursa (job #2023407)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 250005
long long C[1 + MAXN];
long long S1[1 + MAXN], S2[1 + MAXN];
long long P[1 + MAXN];
long long S[1 + MAXN];
inline int min(int a, int b){
return a < b ? a : b;
}
inline int max(int a, int b){
return a > b ? a : b;
}
int main(){
FILE*fi,*fo;
fi = fopen("cuburi2.in","r");
fo = fopen("cuburi2.out","w");
int n, m;
fscanf(fi,"%d%d", &n, &m);
int s = 0;
for(int i = 1; i <= n; i++){
fscanf(fi,"%d", &C[i]);
S1[i] = S1[i - 1] + s;
s = s + C[i];
P[i] = P[i - 1] + C[i] * i;
S[i] = S[i - 1] + C[i];
}
s = 0;
for(int i = n; i >= 1; i--){
S2[i] = S2[i + 1] + s;
s = s + C[i];
}
for(int i = 1; i <= m; i++){
int a, b;
fscanf(fi,"%d%d", &a, &b);
long long pivot = (P[b] - P[a - 1])/(S[b] - S[a - 1]);
int optim = a;
for(int i = max(a, pivot - 5); i <= min(b, pivot + 5); i++)
if(S1[optim] - S1[a] - S[a - 1] * (optim - a) + S2[optim] - S2[b] - (S[n] - S[b]) * (b - optim) > S1[i] - S1[a] - S[a - 1] * (i - a) + S2[i] - S2[b] - (S[n] - S[b]) * (b - i))
optim = i;
fprintf(fo,"%d %lld\n", optim, S1[optim] - S1[a] - S[a - 1] * (optim - a) + S2[optim] - S2[b] - S[b + 1] * (b - optim));
}
fclose(fi);
fclose(fo);
return 0;
}