Pagini recente » Cod sursa (job #1456294) | Cod sursa (job #380200) | Cod sursa (job #2639757) | Cod sursa (job #1564439) | Cod sursa (job #1244000)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("scandura.in");
ofstream fout("scandura.out");
int N, M, dif, nodnow;
long long result;
long long val[2000002];
queue<int> Qnodinit, Qnod;
void solve()
{
while (!Qnodinit.empty() || !Qnod.empty())
{
++nodnow;
for (int i = 1; i <= M; ++i)
{
int now;
if (Qnodinit.empty())
{
now = Qnod.front();
Qnod.pop();
}
else if (Qnod.empty())
{
now = Qnodinit.front();
Qnodinit.pop();
}
else if (val[Qnodinit.front()] <= val[Qnod.front()])
{
now = Qnodinit.front();
Qnodinit.pop();
}
else
{
now = Qnod.front();
Qnod.pop();
}
val[nodnow] += val[now];
}
if (!Qnod.empty())
{
Qnod.push(nodnow);
result += val[nodnow];
}
else if (Qnod.empty() && !Qnodinit.empty())
{
Qnod.push(nodnow);
result += val[nodnow];
}
}
result += val[nodnow];
}
int main()
{
freopen("scandura.in", "r", stdin);
freopen("scandura.out", "w", stdout);
fin >> N >> M;
dif = N;
nodnow = N;
while (dif > 1)
dif = dif - M + 1;
if (dif == 1)
dif = 0;
else
{
dif = dif + M - 1;
++nodnow;
for (int i = 1; i <= dif; ++i)
{
fin >> val[i];
val[nodnow] += val[i];
}
result += val[nodnow];
Qnod.push(nodnow);
}
for (int i = dif + 1; i <= N; ++i)
{
fin >> val[i];
Qnodinit.push(i);
}
solve();
fout << result << '\n';
return 0;
}