# PBinfo #4335 – arme1 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Aceasta este problema arme (1063) în care s-au mărit dimensiunile vectorilor. Încercați să rezolvați mai întâi problema originală, apoi pe aceasta.

Vasile joacă (din nou!) jocul său preferat cu împuşcături. Personajul său are la brâu N arme, aşezate în N huse speciale, numerotate de la 1 la N. Arma din husa i are puterea pbi (1≤i≤N). În camera armelor a găsit M arme, aşezate pe perete, în M locaţii, numerotate de la 1 la M. Pentru fiecare armă j (1≤j≤M) este cunoscută puterea sa pcj. Vasile poate înlocui arme pe care le are la brâu cu arme aflate pe perete în camera armelor. La o înlocuire el ia arma de pe perete din locaţia j (1≤j≤M) şi o pune la brâu în husa i (1≤i≤N), iar arma din husa i o pune pe perete în locaţia j.

Cerinţă
Scrieţi un program care să determine suma maximă a puterilor armelor pe care le va avea la brâu Vasile după efectuarea înlocuirilor.

Date de intrare
Datele se citesc de la tastatură. De pe prima linie se citesc numerele naturale N M, reprezentând numărul de arme pe care le are la brâu, respectiv numărul de arme aflate în camera armelor. Pe a doua linie se află N numere naturale pb1 pb2 … pbN reprezentând în ordine puterile armelor pe care Vasile le are la brâu. Pe a treia linie se află M numere naturale pc1 pc2 … pcM reprezentând în ordine puterile armelor aflate în camera armelor. Numerele scrise pe aceeaşi linie sunt separate prin spaţiu.

Date de ieșire
Se va afișa la ecran suma maximă a puterilor armelor de la brâul lui Vasile, după efectuarea înlocuirilor.

Restricții și precizări

10.000 ≤ N, M ≤ 50.000
Puterile armelor sunt numere naturale ≤1.000.000.000.

Exemplu:
Intrare

3 2
3 1 7
4 5
Ieșire

16

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
int n, m, b[50003];
priority_queue<int> Q;
int Aleator(int L)
{
    int i, x = rand();
    for (i = 1; i <= 20; i++)
        x = 1LL * x * rand() % L + 1;
    return x;
}
int main()
{
    int i, x;
    long long smax;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
    {
        cin >> x;
        Q.push(-x);
    }
    for (i = 1; i <= m; i++)
        cin >> b[i];
    sort(b + 1, b + m + 1);
    for (i = 1; i <= m; i++)
        if (b[i] > -Q.top())
        {
            Q.pop();
            Q.push(-b[i]);
        }
    smax = 0;
    while (!Q.empty())
    {
        smax -= Q.top();
        Q.pop();
    }
    cout << smax;
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4335)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4335/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4335/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
