#include <iostream> #include <algorithm> #include <set> #include <vector> using namespace std; const int nmax=1e5+10; vector<int> przegra[2*nmax]; vector<int> wygra[2*nmax]; bool vis[2*nmax]; struct talia { int id,lepszy=0,gorszy=0; bool operator<(const talia &a) const { if(a.lepszy==lepszy) { if(a.gorszy==gorszy) { return a.id>id; } return a.gorszy>gorszy; } return a.lepszy<lepszy; } }; talia talie[2*nmax]; set<talia> lewy; set<talia> prawy; int main() { ios_base::sync_with_stdio(0); int t; cin>>t; while(t--) { int n,m; cin>>n>>m; //cout<<"-->"<<n<<" "<<m<<"\n"; lewy.clear(); prawy.clear(); for(int i=1; i<=n; i++) { vis[i]=0; vis[i+nmax]=0; talie[i].id=i; talie[i+nmax].id=i+nmax; talie[i].lepszy=0; talie[i].gorszy=0; talie[i+nmax].lepszy=0; talie[i+nmax].gorszy=0; przegra[i].clear(); przegra[i+nmax].clear(); wygra[i].clear(); wygra[i+nmax].clear(); } for(int i=0; i<m; i++) { int a,c; char b; cin>>a>>b>>c; if(b=='>') { talie[c+nmax].gorszy++; talie[a].lepszy++; przegra[c+nmax].push_back(a); wygra[a].push_back(c+nmax); } else { talie[c+nmax].lepszy++; talie[a].gorszy++; przegra[a].push_back(c+nmax); wygra[c+nmax].push_back(a); } } for(int i=1; i<=n; i++) { //talie[i].id=i; lewy.insert(talie[i]); //cout<<"b "<<lewy.size()<<" "<<talie[i].id<<"\n"; } for(int i=1; i<=n; i++) { // talie[i+nmax].id=i+nmax; prawy.insert(talie[i+nmax]); //cout<<"b"<<prawy.size()<<" "; } set<talia>::iterator it1; /*cout<<"\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; */ for(int i=1; i<n; i++) { it1=prawy.begin(); vis[it1->id]=true; for(int j=0; j<przegra[ it1->id ].size(); j++) { int a=przegra[ it1->id ][j]; if(!vis[a]) { lewy.erase(talie[a]); talie[a].lepszy--; lewy.insert(talie[a]); } } for(int j=0; j<wygra[ it1->id ].size(); j++) { int a=wygra[ it1->id ][j]; if(!vis[a]) { lewy.erase(talie[a]); talie[a].gorszy--; lewy.insert(talie[a]); } } prawy.erase(it1); /*cout<<"wypisz:\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; */ it1=lewy.begin(); vis[ it1->id]=true; for(int j=0; j<przegra[ it1->id ].size(); j++) { int a=przegra[ it1->id][j]; if(!vis[a]) { prawy.erase(talie[a]); talie[a].lepszy--; prawy.insert(talie[a]); } } for(int j=0; j<wygra[ it1->id ].size(); j++) { int a=wygra[ it1->id ][j]; if(!vis[a]) { prawy.erase(talie[a]); talie[a].gorszy--; prawy.insert(talie[a]); } } lewy.erase(it1); /*cout<<"wypisz2:\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n\n"; */ } /*cout<<"pozostalo: "<<lewy.size()<<" "<<prawy.size()<<"\n"; it1=lewy.begin(); cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; it1=prawy.begin(); cout<<it1->id-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; */ it1=lewy.begin(); if(it1->lepszy>0) cout<<"WYGRANA\n"; else { it1=prawy.begin(); if(it1->lepszy>0) cout<<"PRZEGRANA\n"; else cout<<"REMIS\n"; } } } /* 3 2 4 1 > 1 2 > 2 1 < 2 2 < 1 3 6 1 > 1 2 > 2 3 > 3 1 < 2 2 < 3 3 < 1 4 8 1 > 1 2 > 2 3 > 3 4 > 4 1 < 2 2 < 3 3 < 4 4 < 1 */
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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | #include <iostream> #include <algorithm> #include <set> #include <vector> using namespace std; const int nmax=1e5+10; vector<int> przegra[2*nmax]; vector<int> wygra[2*nmax]; bool vis[2*nmax]; struct talia { int id,lepszy=0,gorszy=0; bool operator<(const talia &a) const { if(a.lepszy==lepszy) { if(a.gorszy==gorszy) { return a.id>id; } return a.gorszy>gorszy; } return a.lepszy<lepszy; } }; talia talie[2*nmax]; set<talia> lewy; set<talia> prawy; int main() { ios_base::sync_with_stdio(0); int t; cin>>t; while(t--) { int n,m; cin>>n>>m; //cout<<"-->"<<n<<" "<<m<<"\n"; lewy.clear(); prawy.clear(); for(int i=1; i<=n; i++) { vis[i]=0; vis[i+nmax]=0; talie[i].id=i; talie[i+nmax].id=i+nmax; talie[i].lepszy=0; talie[i].gorszy=0; talie[i+nmax].lepszy=0; talie[i+nmax].gorszy=0; przegra[i].clear(); przegra[i+nmax].clear(); wygra[i].clear(); wygra[i+nmax].clear(); } for(int i=0; i<m; i++) { int a,c; char b; cin>>a>>b>>c; if(b=='>') { talie[c+nmax].gorszy++; talie[a].lepszy++; przegra[c+nmax].push_back(a); wygra[a].push_back(c+nmax); } else { talie[c+nmax].lepszy++; talie[a].gorszy++; przegra[a].push_back(c+nmax); wygra[c+nmax].push_back(a); } } for(int i=1; i<=n; i++) { //talie[i].id=i; lewy.insert(talie[i]); //cout<<"b "<<lewy.size()<<" "<<talie[i].id<<"\n"; } for(int i=1; i<=n; i++) { // talie[i+nmax].id=i+nmax; prawy.insert(talie[i+nmax]); //cout<<"b"<<prawy.size()<<" "; } set<talia>::iterator it1; /*cout<<"\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; */ for(int i=1; i<n; i++) { it1=prawy.begin(); vis[it1->id]=true; for(int j=0; j<przegra[ it1->id ].size(); j++) { int a=przegra[ it1->id ][j]; if(!vis[a]) { lewy.erase(talie[a]); talie[a].lepszy--; lewy.insert(talie[a]); } } for(int j=0; j<wygra[ it1->id ].size(); j++) { int a=wygra[ it1->id ][j]; if(!vis[a]) { lewy.erase(talie[a]); talie[a].gorszy--; lewy.insert(talie[a]); } } prawy.erase(it1); /*cout<<"wypisz:\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; */ it1=lewy.begin(); vis[ it1->id]=true; for(int j=0; j<przegra[ it1->id ].size(); j++) { int a=przegra[ it1->id][j]; if(!vis[a]) { prawy.erase(talie[a]); talie[a].lepszy--; prawy.insert(talie[a]); } } for(int j=0; j<wygra[ it1->id ].size(); j++) { int a=wygra[ it1->id ][j]; if(!vis[a]) { prawy.erase(talie[a]); talie[a].gorszy--; prawy.insert(talie[a]); } } lewy.erase(it1); /*cout<<"wypisz2:\n"; for(it1=lewy.begin(); it1!=lewy.end(); it1++) cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n"; for(it1=prawy.begin(); it1!=prawy.end(); it1++) cout<<(it1->id)-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; cout<<"\n\n"; */ } /*cout<<"pozostalo: "<<lewy.size()<<" "<<prawy.size()<<"\n"; it1=lewy.begin(); cout<<it1->id<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; it1=prawy.begin(); cout<<it1->id-nmax<<" "<<it1->lepszy<<" "<<it1->gorszy<<"\n"; */ it1=lewy.begin(); if(it1->lepszy>0) cout<<"WYGRANA\n"; else { it1=prawy.begin(); if(it1->lepszy>0) cout<<"PRZEGRANA\n"; else cout<<"REMIS\n"; } } } /* 3 2 4 1 > 1 2 > 2 1 < 2 2 < 1 3 6 1 > 1 2 > 2 3 > 3 1 < 2 2 < 3 3 < 1 4 8 1 > 1 2 > 2 3 > 3 4 > 4 1 < 2 2 < 3 3 < 4 4 < 1 */ |