Pagini recente » Cod sursa (job #2304683) | Cod sursa (job #2493111) | Cod sursa (job #235881) | Cod sursa (job #23153) | Cod sursa (job #1431941)
#include <cstdio>
#define INF ((1LL<<63)-1)
#define DIM 256000
using namespace std;
FILE *fin = fopen("cuburi2.in" ,"r");
FILE *fout= fopen("cuburi2.out","w");
int N, V[DIM], Q, X, Y; long long A[DIM], B[DIM];
void SetUp(){
fscanf(fin, "%d %d", &N, &Q);
for(int i = 1; i <= N; i ++){
fscanf(fin, "%d", &V[i]);
A[i] = A[i-1] + V[i];
B[i] = B[i-1] + V[i] * 1LL * i;
}
return;
}
inline long long Dist(long long A[], long long B[], int st, int mid, int dr){
return ((A[mid] - A[st-1]) * 1LL * mid - (B[mid] - B[st-1])) + ((B[dr] - B[mid-1]) - (A[dr] - A[mid-1]) * 1LL * mid);
}
void Query(int X, int Y){
int st = X, dr = Y;
while(st <= dr){
int mid = st + (dr - st) / 2;
long long val1 = 0, val2 = 0, val3 = 0;
if(mid-1 >= st) val1 = Dist(A, B, X, mid-1, Y);
else val1 = INF;
val2 = Dist(A, B, X, mid , Y);
if(mid+1 <= dr) val3 = Dist(A, B, X, mid+1, Y);
else val3 = INF;
if(val2 <= val1 && val2 <= val3){
fprintf(fout, "%d %d\n", mid, val2);
return;
} else {
if(val1 < val2) dr = mid - 1;
if(val3 < val2) st = mid + 1;
}
}
return;
}
int main(){
SetUp();
while(Q){
fscanf(fin, "%d %d", &X, &Y);
Query(X, Y); Q --;
}
return 0;
}