Advertisement
BaoJIaoPisu

Untitled

Nov 5th, 2022
1,134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.31 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ld = long double;
  7. using ull = unsigned long long;
  8.  
  9. using pii = pair<int, int>;
  10. using pll = pair<ll, ll>;
  11. using pld = pair<ld, ld>;
  12.  
  13. #define fi first
  14. #define se second
  15. #define pb push_back
  16. #define pf push_front
  17. #define mp make_pair
  18. #define ins insert
  19. #define btpc __builtin_popcount
  20. #define btclz __builtin_clz
  21.  
  22. #define sz(x) (int)(x.size());
  23. #define all(x) x.begin(), x.end()
  24. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  25.  
  26. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  27.  
  28. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  29. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  30. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  31.  
  32. template<class X, class Y>
  33.     bool minimize(X &x, const Y &y) {
  34.         if (x > y)
  35.         {
  36.             x = y;
  37.             return true;
  38.         }
  39.         return false;
  40.     }
  41. template<class X, class Y>
  42.     bool maximize(X &x, const Y &y) {
  43.         if (x < y)
  44.         {
  45.             x = y;
  46.             return true;
  47.         }
  48.         return false;
  49.     }
  50.  
  51. const int MOD = 1e9 + 7; //998244353
  52.  
  53. template<class X, class Y>
  54.     void add(X &x, const Y &y) {
  55.         x = (x + y);
  56.         if(x >= MOD) x -= MOD;
  57.     }
  58.  
  59. template<class X, class Y>
  60.     void sub(X &x, const Y &y) {
  61.         x = (x - y);
  62.         if(x < 0) x += MOD;
  63.     }
  64.  
  65. /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
  66.  
  67. const ll INF = 1e9;
  68. const int N = 1e5 + 10;
  69.  
  70. multiset<int> g[N], rev[N];
  71. int pre[N], dist[N], is_change[N], inq[N], cnt[N];
  72. vector<int> on_path[N];
  73. pii ed[N];
  74.  
  75. void solve() {
  76.     int n, m; cin >> n >> m;
  77.     for(int i = 1; i <= m; i++) {
  78.         int u, v; cin >> u >> v;
  79.         g[u].ins(v);
  80.         rev[v].ins(u);
  81.         ed[i] = mp(u, v);
  82.     }
  83.  
  84.     dist[1] = 0;
  85.     for(int i = 2; i <= n; i++) dist[i] = INF;
  86.     queue<int> q;
  87.     q.push(1);
  88.  
  89.     while(!q.empty()) {
  90.         int u = q.front(); q.pop();
  91.         for(auto v : g[u]) {
  92.             if(minimize(dist[v], dist[u] + 1)) cnt[v] = 1, q.push(v);
  93.             else if(dist[v] == dist[u] + 1) cnt[v]++;
  94.         }
  95.     }
  96.  
  97.     int qu; cin >> qu;
  98.     int last = 0;
  99.     for(int _ = 1; _ <= qu; _++) {
  100.         int t; cin >> t;
  101.         if(t == 1) {
  102.             int x; cin >> x;
  103.             int id = (x + last) % m + 1;
  104.             int u = ed[id].fi, v = ed[id].se;
  105.             auto iter = g[u].find(v);
  106.             g[u].erase(iter);
  107.             iter = rev[v].find(u);
  108.             rev[v].erase(iter);
  109.             if(dist[u] + 1 == dist[v]) --cnt[v];
  110.             if(cnt[v] > 0) continue;
  111.  
  112.             queue<int> q;
  113.             q.push(v);
  114.  
  115.             vector<int> change;
  116.             change.pb(v);
  117.             is_change[v] = _;
  118.             while(!q.empty()) {
  119.                 int u = q.front(); q.pop();
  120.                 for(auto v : g[u]) {
  121.                     if(dist[u] + 1 == dist[v]) {
  122.                         --cnt[v];
  123.                         if(!cnt[v]) change.pb(v), is_change[v] = _, q.push(v);
  124.                     }
  125.                 }
  126.                 dist[u] = INF;
  127.             }
  128.  
  129.  
  130.             vector<int> new_node;
  131.             for(auto u : change) {
  132.                 pre[u] = 0;
  133.                 for(auto v : rev[u]) {
  134.                     if(is_change[v] != _) {
  135.                         if(minimize(dist[u], dist[v] + 1)) cnt[u] = 1;
  136.                         else if(dist[u] == dist[v] + 1) cnt[u]++;
  137.                     }
  138.                 }
  139.                 if(dist[u] < INF) new_node.pb(u);
  140.             }
  141.  
  142.             sort(all(new_node), [&](int u, int v) {
  143.                 return dist[u] > dist[v];
  144.             });
  145.  
  146.             while(q.size() || new_node.size()) {
  147.                 if(q.empty()) {
  148.                     int d = dist[new_node.back()];
  149.                     while(new_node.size() && dist[new_node.back()] <= d) {
  150.                         int u = new_node.back();
  151.                         if(inq[u] != _) q.push(u);
  152.                         inq[u] = _;
  153.                         new_node.pop_back();
  154.                     }
  155.                 }
  156.  
  157.                 while(!q.empty()) {
  158.                     int u = q.front(); q.pop();
  159.                     for(auto v : g[u]) {
  160.                         if(minimize(dist[v], dist[u] + 1)) {
  161.                             cnt[v] = 1, q.push(v), inq[v] = _;
  162.                             while(!new_node.empty() && dist[new_node.back()] <= dist[v]) {
  163.                                 int u = new_node.back();
  164.                                 if(inq[u] != _) q.push(u);
  165.                                 inq[u] = _;
  166.                                 new_node.pop_back();
  167.                             }
  168.                         }
  169.                         else if(dist[v] == dist[u] + 1) cnt[v]++;
  170.                     }
  171.                 }
  172.             }  
  173.         } else {
  174.             int u; cin >> u;
  175.             last = dist[u];
  176.             if(last == INF) last = -1;
  177.             cout << last << '\n';
  178.         }
  179.     }
  180. }
  181.  
  182. int main()
  183. {
  184.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  185.     #ifndef ONLINE_JUDGE
  186.     freopen("input.txt", "r", stdin);
  187.     freopen("output.txt", "w", stdout);
  188.     #else
  189.     //online
  190.     #endif
  191.  
  192.     int tc = 1, ddd = 0;
  193.     // cin >> tc;
  194.     while(tc--) {
  195.         //ddd++;
  196.         //cout << "Case #" << ddd << ": ";
  197.         solve();
  198.     }
  199. }
  200.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement