Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define FOR(i, a, b) for (int i = a; i <= b; ++i)
  3. #define ii pair <int, int>
  4. using namespace std;
  5. const int N = 1e5 + 3, Q = 5e5 + 3;
  6. int n, q;
  7. ii Qr[Q];
  8.  
  9. void init() {
  10. ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  11. //freopen("main.inp","r",stdin);
  12. //freopen("main.out","w",stdout);
  13. }
  14.  
  15. void read(int &val) {
  16. char c; do { c = getchar(); } while (! isdigit(c));
  17. int res = c - '0'; while (isdigit(c = getchar())) res = 10 * res + c - '0';
  18. val = res;
  19. }
  20.  
  21. vector <int> adj[N];
  22. int stt, topo[N], vis[N];
  23. void dfs(int u) {
  24. vis[u] = true;
  25. for (int v : adj[u])
  26. if (! vis[v]) dfs(v);
  27. topo[stt--] = u;
  28. }
  29.  
  30. int check[N];
  31. int Count(int u) {
  32. check[u] = 1;
  33. int ans = 1;
  34. for (int v : adj[u])
  35. if (! check[v]) ans += Count(v);
  36. return ans;
  37. }
  38.  
  39. bool kt(int mid) {
  40. FOR(i, 1, n) adj[i].clear(), vis[i] = check[i] = 0;
  41. FOR(i, 1, mid) adj[ Qr[i].first ].push_back( Qr[i].second );
  42. stt = n;
  43. FOR(i, 1, n) if (! vis[i]) dfs(i);
  44. int mid1 = topo[n/2 + 1], dem = Count(mid1);
  45. if (dem != n/2 + 1) return false;
  46.  
  47. FOR(i, 1, n) adj[i].clear(), vis[i] = check[i] = 0;
  48. FOR(i, 1, mid) adj[ Qr[i].second ].push_back( Qr[i].first );
  49. stt = n;
  50. FOR(i, 1, n) if (! vis[i]) dfs(i);
  51. int mid2 = topo[n/2 + 1]; dem = Count(mid2);
  52. if (dem != n/2 + 1 || mid1 != mid2) return false;
  53.  
  54. return true;
  55. }
  56.  
  57. void solve() {
  58. cin >> n >> q;
  59. FOR(id, 1, q) {
  60. int i, j; char c;
  61. cin >> i >> j >> c;
  62. if (c == '>') swap(i, j);
  63. Qr[id] = { ++i, ++j };
  64. }
  65.  
  66. int lo = 0, hi = q;
  67. int res = -1;
  68. while (lo <= hi) {
  69. int mid = lo + hi >> 1;
  70. if (kt(mid)) res = mid, hi = mid - 1; else lo = mid + 1;
  71. }
  72. cout << res;
  73. }
  74.  
  75. main() {
  76. init(); solve();
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement