#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 */ |
English