Pagini recente » Cod sursa (job #1778094) | Cod sursa (job #3282138) | Cod sursa (job #324091) | Cod sursa (job #2801635) | Cod sursa (job #1500366)
#include <iostream>
#include <fstream>
using namespace std;
ofstream out ("cuburi2.out");
const int MAXN = 250010;
int V[MAXN];
long long A[MAXN], Left[MAXN];
long long B[MAXN], Right[MAXN];
long long f (int X, int mid, int Y)
{
//calculeaza costul pentru a muta toate cuburile din [X, Y] pe turnul de pe pozitia mid
long long ret = 0;
ret = Right[mid] - Right[Y];
ret -= 1LL * B[Y + 1] * (Y - mid);
ret += Left[mid] - Left[X];
ret -= 1LL * A[X - 1] * (mid - X);
return ret;
}
class Reader
{
private:
static const int BUFF_SIZE = 4096;
char Buffer[BUFF_SIZE];
int at;
ifstream in;
public:
Reader (const char *S){
in.open (S);
in.read (Buffer, BUFF_SIZE);
at = 0;
}
void getBlock ()
{
in.read (Buffer, BUFF_SIZE);
at = 0;
}
char getChar ()
{
if (at == BUFF_SIZE)
getBlock ();
const char c = Buffer[at];
at ++;
return c;
}
int getInt ()
{
int ret = 0;
char c;
do{
c = getChar ();
} while (!isdigit (c));
do{
ret = (ret * 10) + (c - '0');
c = getChar ();
} while (isdigit (c));
return ret;
}
Reader& operator >> (int &X)
{
X = getInt ();
return *this;
}
};
int main ()
{
int N, M;
int i;
Reader in ("cuburi2.in");
in >> N >> M;
for (i = 1; i <= N; i ++){
in >> V[i];
A[i] = A[i - 1] + V[i];
Left[i] = Left[i - 1] + A[i - 1];
}
for (i = N; i; i --){
B[i] = B[i + 1] + V[i];
Right[i] = Right[i + 1] + B[i + 1];
}
int x, y;
int step, idx;
while (M --){
in >> x >> y;
for (step = 1; step < y - x + 1; step <<= 1);
for (i = x - 1; step; step >>= 1)
if (i + step <= y)
if (A[i + step] - A[x - 1] >= A[y] - A[i + step])
idx = i + step;
else
i += step;
out << idx << " " << f (x, idx, y) << "\n";
}
return 0;
}