#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <cstdint>
typedef int atom;
typedef std::vector<std::unordered_set<atom>> wiazania;
struct zmiana {
    atom a;
    atom b;
    char znak;
};
void wyznacz_odleglosci(atom z, std::vector<atom> &kolejnosc, wiazania &czasteczka) {
    std::vector<bool> zakolejkowane;
    zakolejkowane.resize(czasteczka.size());
    kolejnosc.clear();
    kolejnosc.reserve(czasteczka.size()-1);
    kolejnosc.push_back(z);
    zakolejkowane[z] = true;
    for (int i = 0; kolejnosc.size() < czasteczka.size()-1; ++i) {
        atom wierzcholek = kolejnosc[i];
        for (atom sasiad: czasteczka[wierzcholek]) {
            if (!zakolejkowane[sasiad]) {
                kolejnosc.push_back(sasiad);
                zakolejkowane[sasiad] = true;
            }
        }
    }
}
void dodaj_mosty(atom z, std::vector<atom> &kolejnosc, wiazania &czasteczka, std::vector<zmiana> &zmiany) {
    for (atom sasiad: kolejnosc) {
        if (sasiad != z && czasteczka[z].find(sasiad) == czasteczka[z].end()) {
            zmiany.emplace_back(z, sasiad, '+');
            czasteczka[z].insert(sasiad);
            czasteczka[sasiad].insert(z);
        }
    }
}
void dodaj_pozadane(wiazania &pozadana, wiazania &czasteczka, std::vector<zmiana> &zmiany) {
    for (int i=1; i<(int)pozadana.size(); ++i) {
        for (atom sasiad: pozadana[i]) {
            if (i < sasiad && czasteczka[i].find(sasiad) == czasteczka[i].end()) {
                zmiany.emplace_back(i, sasiad, '+');
            }
        }
    }
}
void usun_nadmiarowe(wiazania &pozadana, wiazania &czasteczka, std::vector<zmiana> &zmiany) {
    for (int i=1; i<(int)czasteczka.size(); ++i) {
        for (atom sasiad: czasteczka[i]) {
            if (i < sasiad && pozadana[i].find(sasiad) == pozadana[i].end()) {
                zmiany.emplace_back(i, sasiad, '-');
            }
        }
    }
}
int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    wiazania czasteczka;
    wiazania pozadane;
    std::vector<zmiana> zmiany;
    int atomow;
    int wiazan_poczatkowych;
    int wiazan_pozadanych;
    std::cin >> atomow;
    czasteczka.resize(atomow+1);
    pozadane.resize(atomow+1);
    std::cin >> wiazan_poczatkowych;
    atom z;
    atom ku;
    for (int i=0; i<wiazan_poczatkowych; ++i) {
        std::cin >> z >> ku;
        czasteczka[z].insert(ku);
        czasteczka[ku].insert(z);
    }
    std::cin >> wiazan_pozadanych;
    atom korzen = 1;
    std::vector<atom> kolejnosc;
    wyznacz_odleglosci(korzen, kolejnosc, czasteczka);
    dodaj_mosty(korzen, kolejnosc, czasteczka, zmiany);
    for (int i=0; i<wiazan_pozadanych; ++i) {
        std::cin >> z >> ku;
        pozadane[z].insert(ku);
        pozadane[ku].insert(z);
    }
    dodaj_pozadane(pozadane, czasteczka, zmiany);
    usun_nadmiarowe(pozadane, czasteczka, zmiany);
    std::cout << zmiany.size() << "\n";
    for (zmiana &zm: zmiany) {
        std::cout << zm.znak << " " << zm.a << " " << zm.b << "\n";
    }
}
        1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113  | #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> #include <unordered_set> #include <cstdint> typedef int atom; typedef std::vector<std::unordered_set<atom>> wiazania; struct zmiana { atom a; atom b; char znak; }; void wyznacz_odleglosci(atom z, std::vector<atom> &kolejnosc, wiazania &czasteczka) { std::vector<bool> zakolejkowane; zakolejkowane.resize(czasteczka.size()); kolejnosc.clear(); kolejnosc.reserve(czasteczka.size()-1); kolejnosc.push_back(z); zakolejkowane[z] = true; for (int i = 0; kolejnosc.size() < czasteczka.size()-1; ++i) { atom wierzcholek = kolejnosc[i]; for (atom sasiad: czasteczka[wierzcholek]) { if (!zakolejkowane[sasiad]) { kolejnosc.push_back(sasiad); zakolejkowane[sasiad] = true; } } } } void dodaj_mosty(atom z, std::vector<atom> &kolejnosc, wiazania &czasteczka, std::vector<zmiana> &zmiany) { for (atom sasiad: kolejnosc) { if (sasiad != z && czasteczka[z].find(sasiad) == czasteczka[z].end()) { zmiany.emplace_back(z, sasiad, '+'); czasteczka[z].insert(sasiad); czasteczka[sasiad].insert(z); } } } void dodaj_pozadane(wiazania &pozadana, wiazania &czasteczka, std::vector<zmiana> &zmiany) { for (int i=1; i<(int)pozadana.size(); ++i) { for (atom sasiad: pozadana[i]) { if (i < sasiad && czasteczka[i].find(sasiad) == czasteczka[i].end()) { zmiany.emplace_back(i, sasiad, '+'); } } } } void usun_nadmiarowe(wiazania &pozadana, wiazania &czasteczka, std::vector<zmiana> &zmiany) { for (int i=1; i<(int)czasteczka.size(); ++i) { for (atom sasiad: czasteczka[i]) { if (i < sasiad && pozadana[i].find(sasiad) == pozadana[i].end()) { zmiany.emplace_back(i, sasiad, '-'); } } } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); wiazania czasteczka; wiazania pozadane; std::vector<zmiana> zmiany; int atomow; int wiazan_poczatkowych; int wiazan_pozadanych; std::cin >> atomow; czasteczka.resize(atomow+1); pozadane.resize(atomow+1); std::cin >> wiazan_poczatkowych; atom z; atom ku; for (int i=0; i<wiazan_poczatkowych; ++i) { std::cin >> z >> ku; czasteczka[z].insert(ku); czasteczka[ku].insert(z); } std::cin >> wiazan_pozadanych; atom korzen = 1; std::vector<atom> kolejnosc; wyznacz_odleglosci(korzen, kolejnosc, czasteczka); dodaj_mosty(korzen, kolejnosc, czasteczka, zmiany); for (int i=0; i<wiazan_pozadanych; ++i) { std::cin >> z >> ku; pozadane[z].insert(ku); pozadane[ku].insert(z); } dodaj_pozadane(pozadane, czasteczka, zmiany); usun_nadmiarowe(pozadane, czasteczka, zmiany); std::cout << zmiany.size() << "\n"; for (zmiana &zm: zmiany) { std::cout << zm.znak << " " << zm.a << " " << zm.b << "\n"; } }  | 
            
        
                    English