Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // clang-format off
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <stack>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <list>
- #include <unordered_map>
- #include <unordered_set>
- #include <cassert>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- typedef string str;
- //typedef __int128 ultraint;
- #define sqrt sqrtl
- #define F first
- #define S second
- #define endl '\n'
- #define all(vc666) vc666.begin(), vc666.end()
- #define allr(vc666) vc666.rbegin(), vc666.rend()
- #define int long long
- const ll INF = (ll)1e18 + 7;
- const ll inf = 1e9 + 7;
- const ll ONE = 1;
- const ll MOD = (ONE << 32) - 1;
- const ll max_sz = 1e7 + 1;
- ld EPS = 1e-6;
- ld PI = 3.1415926535897932384;
- mt19937_64 gen(time(0));
- struct Elem {
- int value, cnt;
- };
- bool cmp(const Elem& a, const Elem& b) {
- return a.value > b.value;
- }
- void solve() {
- int n, m, i, x, y, sup;
- cin >> n >> m;
- vector <int> elems(n);
- unordered_map <int, int> cnt;
- for (i = 0; i < n; i++) {
- cin >> elems[i];
- cnt[elems[i]]++;
- }
- sort(all(elems));
- elems.erase(unique(all(elems)), elems.end());
- unordered_map <int, int> idx;
- for (i = 0; i < (int)elems.size(); i++) {
- idx[elems[i]] = i;
- }
- vector <unordered_map <int, bool> > ban(elems.size());
- for (i = 0; i < m; i++) {
- cin >> x >> y;
- x = idx[x];
- y = idx[y];
- ban[x][y] = 1;
- ban[y][x] = 1;
- }
- vector <vector <Elem> > keys(n + 1);
- for (auto& it : cnt) {
- keys[it.second].push_back({ it.first, it.second });
- }
- vector <int> keys2;
- for (i = n; i > 0; i--) {
- if (keys[i].size() > 0) {
- sort(all(keys[i]), cmp);
- keys2.push_back(i);
- }
- }
- ll ans = 0;
- for (auto val : elems) {
- sup = cnt[val];
- // val - value
- // sup - cnt
- x = idx[val];
- for (auto& it : keys2) {
- for (auto& it2 : keys[it]) {
- if (val != it2.value && !ban[x][idx[it2.value]]) {
- ans = max(ans, (ll)(sup + it2.cnt) * (ll)(val + it2.value));
- break;
- }
- }
- }
- }
- cout << ans << endl;
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(0);
- cin.tie(NULL);
- cout.tie(NULL);
- int t = 1;
- cin >> t;
- while (t--) {
- solve();
- }
- }
- //Deisgned by skimono
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement