Cod sursa(job #2436170)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 4 iulie 2019 19:57:39
Problema Divk Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ambuscada.in");
ofstream fout("ambuscada.out");

long long n, k, m, p, x;
queue <long long> coada;

struct soldat
{
    long long c, t, sum;
}_soldat[100007];

struct obiectiv
{
    long long dificultate;
}_obiectiv[100007];

bool cmp2(obiectiv a, obiectiv b)
{
    return a.dificultate < b.dificultate;
}

bool cmp(soldat a, soldat b)
{
    if (a.t == b.t)
    {
        return a.c < b.c;
    }
    return a.t < b.t;
}

int main()
{
    fin >> n >> k >> m >> p;
    for (int i = 1; i <= n; ++i)
    {
        fin >> _soldat[i].c >> _soldat[i].t;
    }
    for (int i = 1; i <= p; ++i)
    {
        fin >> _obiectiv[i].dificultate;
    }
    sort(_soldat + 1, _soldat + n + 1, cmp);
    sort(_obiectiv + 1, _obiectiv + p + 1, cmp2);
    long long s = 0;
    for (int i = 1; i <= n; ++i)
    {
        coada.push(_soldat[i].c);
        s = s + _soldat[i].c;
        if (coada.size() > k)
        {
            s = s - coada.front();
            coada.pop();
        }
        _soldat[i].sum = s;
    }
    while (m--)
    {
        fin >> x;
        int st = 1, dr = n, poz = -1;
        while (st <= dr)
        {
            int mid = (st + dr) / 2;
            if (_soldat[mid].t <= x)
            {
                poz = mid;
                st = mid + 1;
            }
            else
            {
                dr = mid - 1;
            }
        }
        if (poz < k)
        {
            fout << -1 << "\n";
        }
        else
        {
            long long capacitate = _soldat[poz].sum;
            st = 1, dr = p;
            int ans = -1;
            while (st <= dr)
            {
                int mid = (st + dr) / 2;
                if (capacitate >= _obiectiv[mid].dificultate)
                {
                    ans = _obiectiv[mid].dificultate;
                    st = mid + 1;
                }
                else
                {
                    dr = mid - 1;
                }
            }
            fout << ans << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}