Cod sursa(job #1244000)

Utilizator Ionut228Ionut Calofir Ionut228 Data 16 octombrie 2014 17:48:14
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#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;
}