#include <iostream>
#include <set>
#include <limits>
#include <unordered_set>
#include <unordered_map>
#include <vector>
using namespace std;
struct entry {
  entry(int _index, int _value): index(_index), value(_value) {}
  entry(int _index) : entry(_index, std::numeric_limits<int>::lowest()) {}
  entry() : entry(-1, -1) {}
  int index = -1;
  int value = 0;
  
  bool operator<(const entry& rhs) const {
    if(index == rhs.index) return false;
    return value < rhs.value;
  }
};
void decrement(multiset<entry>& cards, int index) {
  entry x(index);
  auto found = cards.find(x);
  
  if(found == cards.end()) return;
  
  x = *found;
  cards.erase(found);
  x.value--;
  cards.insert(x);
}
int main()
{
  ios::sync_with_stdio(false);
  int t, n, m;
  int who, whom;
  char tmp;
  
  cin >> t;
  
  while(t--)
  {
    unordered_map<int, unordered_set<int> > bajtekKills, bitekKills;
    vector<entry> bajtekCards, bitekCards;
    cin >> n >> m;
    bajtekCards.resize(n); bitekCards.resize(n);
    for(int i = 0; i < n; ++i) {
      bajtekCards[i] = bitekCards[i] = entry(i, 0);
    }
    
    while(m--)
    {
      cin >> who >> tmp >> whom;
      --who;
      --whom;
      if(bajtekKills.find(who) == bajtekKills.end())
        bajtekKills.insert(make_pair(who, unordered_set<int>()));
      if(bitekKills.find(whom) == bitekKills.end())
        bitekKills.insert(make_pair(whom, unordered_set<int>()));
      
      if(tmp == '>') {
        bajtekKills[who].insert(whom);
        bitekCards[whom].value++;
        bajtekCards[who].value--;
      }
      else {
        bitekKills[whom].insert(who);
        bitekCards[whom].value--;
        bajtekCards[who].value++;
      }
    }
    
    multiset<entry> bajtekCardsSet(bajtekCards.begin(), bajtekCards.end()), bitekCardsSet(bitekCards.begin(), bitekCards.end());
    
    while(bajtekCardsSet.size() > 1) {
      auto removedBitekCard = bitekCardsSet.begin();
      bitekCardsSet.erase(removedBitekCard);
      
      for(int updateCard : bitekKills[removedBitekCard->value]) {
        decrement(bajtekCardsSet, updateCard);
      }
      
      auto removedBajtekCard = bajtekCardsSet.begin();
      bajtekCardsSet.erase(removedBajtekCard);
      
      for(int updateCard : bajtekKills[removedBajtekCard->value]) {
        decrement(bitekCardsSet, updateCard);
      }
    }
    
    auto bajtekCard = bajtekCardsSet.begin()->index;
    auto bitekCard = bitekCardsSet.begin()->index;
    
    if(bajtekKills[bajtekCard].find(bitekCard) != bajtekKills[bajtekCard].end())
      cout << "WYGRANA";
    else if(bitekKills[bitekCard].find(bajtekCard) != bitekKills[bitekCard].end())
      cout << "PRZEGRANA";
    else
      cout << "REMIS";
    
    cout << endl;
  }
  
  return 0;
}
        | 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 | #include <iostream> #include <set> #include <limits> #include <unordered_set> #include <unordered_map> #include <vector> using namespace std; struct entry { entry(int _index, int _value): index(_index), value(_value) {} entry(int _index) : entry(_index, std::numeric_limits<int>::lowest()) {} entry() : entry(-1, -1) {} int index = -1; int value = 0; bool operator<(const entry& rhs) const { if(index == rhs.index) return false; return value < rhs.value; } }; void decrement(multiset<entry>& cards, int index) { entry x(index); auto found = cards.find(x); if(found == cards.end()) return; x = *found; cards.erase(found); x.value--; cards.insert(x); } int main() { ios::sync_with_stdio(false); int t, n, m; int who, whom; char tmp; cin >> t; while(t--) { unordered_map<int, unordered_set<int> > bajtekKills, bitekKills; vector<entry> bajtekCards, bitekCards; cin >> n >> m; bajtekCards.resize(n); bitekCards.resize(n); for(int i = 0; i < n; ++i) { bajtekCards[i] = bitekCards[i] = entry(i, 0); } while(m--) { cin >> who >> tmp >> whom; --who; --whom; if(bajtekKills.find(who) == bajtekKills.end()) bajtekKills.insert(make_pair(who, unordered_set<int>())); if(bitekKills.find(whom) == bitekKills.end()) bitekKills.insert(make_pair(whom, unordered_set<int>())); if(tmp == '>') { bajtekKills[who].insert(whom); bitekCards[whom].value++; bajtekCards[who].value--; } else { bitekKills[whom].insert(who); bitekCards[whom].value--; bajtekCards[who].value++; } } multiset<entry> bajtekCardsSet(bajtekCards.begin(), bajtekCards.end()), bitekCardsSet(bitekCards.begin(), bitekCards.end()); while(bajtekCardsSet.size() > 1) { auto removedBitekCard = bitekCardsSet.begin(); bitekCardsSet.erase(removedBitekCard); for(int updateCard : bitekKills[removedBitekCard->value]) { decrement(bajtekCardsSet, updateCard); } auto removedBajtekCard = bajtekCardsSet.begin(); bajtekCardsSet.erase(removedBajtekCard); for(int updateCard : bajtekKills[removedBajtekCard->value]) { decrement(bitekCardsSet, updateCard); } } auto bajtekCard = bajtekCardsSet.begin()->index; auto bitekCard = bitekCardsSet.begin()->index; if(bajtekKills[bajtekCard].find(bitekCard) != bajtekKills[bajtekCard].end()) cout << "WYGRANA"; else if(bitekKills[bitekCard].find(bajtekCard) != bitekKills[bitekCard].end()) cout << "PRZEGRANA"; else cout << "REMIS"; cout << endl; } return 0; } | 
 
            
         English
                    English