Pagini recente » Cod sursa (job #1954430) | Cod sursa (job #1915609) | Cod sursa (job #1596162) | Cod sursa (job #2202869) | Cod sursa (job #2436170)
#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;
}