Advertisement
tien_noob

d13school

Oct 14th, 2021
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. //Make CSP great again
  2. //You're as beautiful as the day I lost you
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. using namespace std;
  6. const int N = 2e5, oo = 1e9;
  7. int n, m, q, Num[N + 1], s[N + 1];
  8. vector<int> Adj[N + 1];
  9. int d[N + 1];
  10. struct SegmentTree
  11. {
  12.     int Tree[4 * N + 1];
  13.     void BuildTree(int v, int TreeL, int TreeR)
  14.     {
  15.         if (TreeL == TreeR)
  16.         {
  17.             Tree[v] = d[TreeL] + Num[TreeL];
  18.             return ;
  19.         }
  20.         int mid = (TreeL + TreeR)/2;
  21.         BuildTree(v * 2, TreeL, mid);
  22.         BuildTree(v * 2 + 1, mid + 1, TreeR);
  23.         Tree[v] = min(Tree[2 * v], Tree[2 * v + 1]);
  24.     }
  25.     void Update(int v, int TreeL, int TreeR, int pos, int val)
  26.     {
  27.         if (TreeL == TreeR)
  28.         {
  29.             Tree[v] = val;
  30.             return ;
  31.         }
  32.         int mid = (TreeL + TreeR)/2;
  33.         if (pos <= mid)
  34.         {
  35.             Update(v * 2, TreeL, mid, pos, val);
  36.         }
  37.         else
  38.         {
  39.             Update(v * 2 + 1, mid + 1, TreeR, pos, val);
  40.         }
  41.         Tree[v] = min(Tree[2 * v], Tree[2 * v + 1]);
  42.     }
  43.     int Get()
  44.     {
  45.         return Tree[1];
  46.     }
  47. };
  48. SegmentTree Tree;
  49. void read()
  50. {
  51.     cin >> n >> m >> q;
  52.     while(m--)
  53.     {
  54.         int u, v;
  55.         cin >> u >> v;
  56.         Adj[v].push_back(u);
  57.     }
  58.     fill(d + 1, d + n + 1, oo);
  59.     for (int i = 1; i <= n; ++ i)
  60.     {
  61.         cin >> s[i];
  62.         Num[s[i]] = i - 1;
  63.     }
  64. }
  65. void BFS()
  66. {
  67.     queue<int> Q;
  68.     d[n] = 0;
  69.     Q.push(n);
  70.     while(!Q.empty())
  71.     {
  72.         int u = Q.front();
  73.         Q.pop();
  74.         for (int v : Adj[u])
  75.         {
  76.             if (d[v] > d[u] + 1)
  77.             {
  78.                 d[v] = d[u] + 1;
  79.                 Q.push(v);
  80.             }
  81.         }
  82.     }
  83. }
  84. void solve()
  85. {
  86.     BFS();
  87.     Tree.BuildTree(1, 1, n);
  88.     while(q--)
  89.     {
  90.         int i, j;
  91.         cin >> i >> j;
  92.         int u = s[i], v = s[j];
  93.         swap(s[i], s[j]);
  94.         swap(Num[u], Num[v]);
  95.         Tree.Update(1, 1, n, u, Num[u] + d[u]);
  96.         Tree.Update(1, 1, n, v, Num[v] + d[v]);
  97.         cout << Tree.Get() << '\n';
  98.     }
  99. }
  100. int main()
  101. {
  102.     ios_base::sync_with_stdio(false);
  103.     cin.tie(nullptr);
  104.     if (fopen(TASK".INP", "r"))
  105.     {
  106.         freopen(TASK".INP", "r", stdin);
  107.         //freopen(TASK".OUT", "w", stdout);
  108.     }
  109.     int t = 1;
  110.     bool typetest = false;
  111.     if (typetest)
  112.     {
  113.         cin >> t;
  114.     }
  115.     for (int __ = 1; __ <= t; ++ __)
  116.     {
  117.         //cout << "Case " << __ << ": ";
  118.         read();
  119.         solve();
  120.     }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement