Pagini recente » Cod sursa (job #935806) | Cod sursa (job #2110920) | Cod sursa (job #107889) | Cod sursa (job #684316) | Cod sursa (job #1426359)
#include <fstream>
#include <cstring>
#define DIM 260000
using namespace std;
//ifstream fin ("cuburi2.in" );
//ofstream fout("cuburi2.out");
FILE *fin = fopen("cuburi2.in" ,"r");
FILE *fout= fopen("cuburi2.out","w");
int N, M, i, j, K, ok, minim, X, Y;
long long D1[DIM], D2[DIM]; int V[DIM];
long long A[DIM], B[DIM], D[DIM];
int nr;
inline int read(){
int x=0;
char ch = fgetc(fin);
while(!isdigit(ch)){
ch = fgetc(fin);
}
while(isdigit(ch)){
x = 10 * x + ch - '0';
ch = fgetc(fin);
}
return x;
}
inline void SetUp(){
fscanf(fin, "%d %d", &N, &M);
//Parse();
for(i = 1; i <= N; i ++){
//fscanf(fin, "%lld", &V[i]);
V[i] = read();
D[i] = D[i-1] + V[i];
}
for(i = 1; i <= N; i ++){
A[i] = A[i-1] + V[i];
B[i] = B[i-1] + V[i] * 1LL * i;
}
for(i = 1; i <= N; i ++)
D1[i] = i * A[i] - B[i];
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
for(i = 1; i <= N / 2; i ++)
swap(V[i], V[N-i+1]);
for(i = 1; i <= N; i ++){
A[i] = A[i-1] + V[i];
B[i] = B[i-1] + V[i] * 1LL * i;
}
for(i = 1; i <= N; i ++)
D2[i] = i * A[i] - B[i];
for(i = 1; i <= N / 2; i ++)
swap(V[i], V[N-i+1]);
for(i = 1; i <= N / 2; i ++)
swap(D2[i], D2[N-i+1]);
return;
}
inline long long Valoare(int pos, int st, int dr){
return D1[pos] - D1[st] - (D[st-1] - D[0]) * 1LL * (pos - st) + D2[pos] - D2[dr] - (D[N] - D[dr]) * 1LL * (dr - pos);
}
inline void CautBin(int st, int dr){
int p1 = st, p2 = dr;
while(st <= dr){
int mid = st + (dr - st) / 2;
long long val1 = Valoare(mid, p1, p2);
long long val2 = Valoare(mid-1, p1, p2);
long long val3 = Valoare(mid+1, p1, p2);
if(val1 <= val2 && val1 <= val3){
fprintf(fout, "%d %lld\n", mid, val1);
return;
}
if(val3 <= val1)
st = mid + 1;
else
dr = mid - 1;
}
return;
}
/*void Test(){
for(i = 1; i <= N; i ++)
fout << D1[i] << " ";
fout << "\n";
for(i = 1; i <= N; i ++)
fout << D2[i] << " ";
fout << "\n";
return;
}*/
void CodeExpert(){
//Test();
//fout << Valoare(1, 1, 2) << "\n";
for(M = M; M > 0; M --){
X = read(); Y = read();
CautBin(X, Y);
}
return;
}
int main(){
SetUp();
CodeExpert();
return 0;
}