fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <numeric>
  4. using namespace std;
  5. struct DSU {
  6. vector<int> parent;
  7.  
  8. DSU(int n) {
  9. parent.resize(n);
  10. iota(parent.begin(), parent.end(), 0);
  11. }
  12.  
  13. int find_set(int v) {
  14. if (v == parent[v])
  15. return v;
  16. return parent[v] = find_set(parent[v]);
  17. }
  18. void union_sets(int a, int b) {
  19. a = find_set(a);
  20. b = find_set(b);
  21. if (a != b) {
  22. parent[b] = a;
  23. }
  24. }
  25. };
  26.  
  27. int main() {
  28. ios_base::sync_with_stdio(false);
  29. cin.tie(NULL);
  30.  
  31. int n, m;
  32. if (!(cin >> n >> m)) return 0;
  33.  
  34. vector<vector<int>> matrix(n, vector<int>(n, 0));
  35. int virtual_top = n * n;
  36. int virtual_bottom = n * n + 1;
  37.  
  38. DSU dsu(n * n + 2);
  39.  
  40. int dr[] = {-1, 1, 0, 0};
  41. int dc[] = {0, 0, -1, 1};
  42.  
  43. int result = -1;
  44.  
  45. for (int i = 1; i <= m; i++) {
  46. int r, c;
  47. cin >> r >> c;
  48. if (result != -1) continue;
  49.  
  50. matrix[r][c] = 1;
  51. int current_id = r * n + c;
  52.  
  53. if (r == 0) {
  54. dsu.union_sets(current_id, virtual_top);
  55. }
  56. if (r == n - 1) {
  57. dsu.union_sets(current_id, virtual_bottom);
  58. }
  59. for (int d = 0; d < 4; d++) {
  60. int nr = r + dr[d];
  61. int nc = c + dc[d];
  62. if (nr >= 0 && nr < n && nc >= 0 && nc < n && matrix[nr][nc] == 1) {
  63. int neighbor_id = nr * n + nc;
  64. dsu.union_sets(current_id, neighbor_id);
  65. }
  66. }
  67. if (dsu.find_set(virtual_top) == dsu.find_set(virtual_bottom)) {
  68. result = i;
  69. }
  70. }
  71. cout << result << "\n";
  72. return 0;
  73. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
Standard output is empty