# PBinfo #3974 – irdds – Rezolvare C++

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

## Enunț

Cerința
Se dau 2 mulţimi de numere naturale \(A\) și \(B\). Să se afișeze mulţimea rezultată în urma efectuării unei operații.

Date de intrare
Programul citește de la tastatură:


Pe prima linie 2 numere naturale N și M, reprezentând numărul elementelor mulţimii \(A\), respectiv \(B\), urmate de unul dintre caracterele * + - % : 
	
 * intersecţie \(A \cap B   \). 
 + reuniune \(A \cup B   \). 
 - diferența \(A \setminus B   \). 
 % diferența simetrică \((A \setminus B) \cup (B \setminus A)\). 

Pe cea de-a 2-a linie N numere naturale reprezentând elementele mulţimii \(A\).
Pe cea de-a 3-a linie M numere naturale reprezentând elementele mulţimii \(B\).

Date de ieșire
Programul va afișa pe ecran elementele mulţimii rezultate, ordonate crescător, în urma efectuării operaței.

Restricții și precizări

1 ≤ N, M ≤ 200.000
elementele mulţimilor \(A\) și \(B\) vor fi mai mici decât 1.000.000.000
nu există cazul ca în urma efectuării uneia dintre operatii rezultatul să fie egal cu mulţimea vidă.

Intrare

5 5 %
4 5 6 7 8
1 2 3 4 5
Ieșire

1 2 3 6 7 8
Explicație

 \((\{4, 5, 6, 7, 8\} \setminus \{1, 2, 3, 4, 5\}) \cup (\{1, 2, 3, 4, 5\} \setminus \{4, 5, 6, 7, 8\} ) = \{1, 2, 3, 6, 7, 8\}.\)

## Cod sursă C++

```cpp
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
char t;
int N, M;
int main() {
    cin >> N >> M >> t;
    vector <int> a(N);
    for (int i = 0; i < N; i++)
        cin >> a[i];
    vector <int> b(M);
    for (int i = 0; i < M; i++)
        cin >> b[i];
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    vector <int> res(N + M);
    if (t == '*') res.resize(set_intersection(a.begin(), a.end(), b.begin(), b.end(), res.begin()) - res.begin());
    if (t == '+') res.resize(set_union(a.begin(), a.end(), b.begin(), b.end(), res.begin()) - res.begin());
    if (t == '-') res.resize(set_difference(a.begin(), a.end(), b.begin(), b.end(), res.begin()) - res.begin());
    if (t == '%') res.resize(set_symmetric_difference(a.begin(), a.end(), b.begin(), b.end(), res.begin()) - res.begin());
    for (int x : res)
        cout << x << " ";
    return 0;
}
```

## Resurse

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