Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define FOR(i, a, b) for (int i = a; i <= b; ++i)
- #define ii pair <int, int>
- using namespace std;
- const int N = 1e5 + 3, Q = 5e5 + 3;
- int n, q;
- ii Qr[Q];
- void init() {
- ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- //freopen("main.inp","r",stdin);
- //freopen("main.out","w",stdout);
- }
- void read(int &val) {
- char c; do { c = getchar(); } while (! isdigit(c));
- int res = c - '0'; while (isdigit(c = getchar())) res = 10 * res + c - '0';
- val = res;
- }
- vector <int> adj[N];
- int stt, topo[N], vis[N];
- void dfs(int u) {
- vis[u] = true;
- for (int v : adj[u])
- if (! vis[v]) dfs(v);
- topo[stt--] = u;
- }
- int check[N];
- int Count(int u) {
- check[u] = 1;
- int ans = 1;
- for (int v : adj[u])
- if (! check[v]) ans += Count(v);
- return ans;
- }
- bool kt(int mid) {
- FOR(i, 1, n) adj[i].clear(), vis[i] = check[i] = 0;
- FOR(i, 1, mid) adj[ Qr[i].first ].push_back( Qr[i].second );
- stt = n;
- FOR(i, 1, n) if (! vis[i]) dfs(i);
- int mid1 = topo[n/2 + 1], dem = Count(mid1);
- if (dem != n/2 + 1) return false;
- FOR(i, 1, n) adj[i].clear(), vis[i] = check[i] = 0;
- FOR(i, 1, mid) adj[ Qr[i].second ].push_back( Qr[i].first );
- stt = n;
- FOR(i, 1, n) if (! vis[i]) dfs(i);
- int mid2 = topo[n/2 + 1]; dem = Count(mid2);
- if (dem != n/2 + 1 || mid1 != mid2) return false;
- return true;
- }
- void solve() {
- cin >> n >> q;
- FOR(id, 1, q) {
- int i, j; char c;
- cin >> i >> j >> c;
- if (c == '>') swap(i, j);
- Qr[id] = { ++i, ++j };
- }
- int lo = 0, hi = q;
- int res = -1;
- while (lo <= hi) {
- int mid = lo + hi >> 1;
- if (kt(mid)) res = mid, hi = mid - 1; else lo = mid + 1;
- }
- cout << res;
- }
- main() {
- init(); solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement