DuongNhi99

1

Dec 21st, 2020 (edited)
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int64_t long long
  3. using namespace std;
  4.  
  5. const int N = 1e5 + 5;
  6. const int oo = 1e9 + 7;
  7.  
  8. typedef pair<int64_t, int> ii;
  9.  
  10. int n, q;
  11. int a[N];
  12.  
  13. namespace Sub1 {
  14. int64_t d[N];
  15.  
  16. void Dijkstra(int s, int f) {
  17.    priority_queue<ii, vector<ii>, greater<ii>> pq;
  18.    fill(d + 1, d + n + 1, oo);
  19.    d[s] = 0;
  20.    pq.push({0, s});
  21.  
  22.    while(!pq.empty()) {
  23.       int u = pq.top().second;
  24.       int64_t du = pq.top().first;
  25.       pq.pop();
  26.  
  27.       if(u == f) return;
  28.       if(du != d[u]) continue;
  29.  
  30.       for(int i = 1; i <= n; ++i) {
  31.          int v = i;
  32.          int64_t uv = a[u] * a[v];
  33.  
  34.          if(d[v] > d[u] + uv) {
  35.             d[v] = d[u] + uv;
  36.             pq.push({d[v], v});
  37.          }
  38.       }
  39.    }
  40. }
  41.  
  42. void solve() {
  43.    for(int i = 1; i <= q; ++i) {
  44.       int k, u, v;
  45.       cin >> k >> u >> v;
  46.       if(k == 1) a[u] = v;
  47.       else {
  48.          Dijkstra(u, v);
  49.          cout << d[v] << '\n';
  50.       }
  51.    }
  52. }
  53. }//namespace Sub1
  54.  
  55. namespace Sub3 {
  56. int d[105][105];
  57.  
  58. void minimize(int &a, int b) {
  59.     if(a > b) a = b;
  60. }
  61.  
  62. void Floyd() {
  63.    for(int i = 1; i <= n; i++)
  64.       for(int j = 1; j <= n; j++)
  65.         d[i][j] = d[j][i] = a[i] * a[j];
  66.    for(int i = 1; i <= n; i++)
  67.       d[i][i] = 0;
  68.  
  69.    for(int k = 1; k <= n; k++)
  70.       for(int i = 1; i <= n; i++)
  71.          for(int j = 1; j <= n; j++)
  72.                minimize(d[i][j], d[i][k] + d[k][j]);
  73. }
  74.  
  75. void solve() {
  76.    Floyd();
  77.    for(int i = 1; i <= q; ++i) {
  78.       int k, u, v;
  79.       cin >> k >> u >> v;
  80.       if(k == 1) {
  81.          a[u] = v;
  82.          Floyd();
  83.       }
  84.       else cout << d[u][v] << '\n';
  85.    }
  86. }
  87. }//namespace Sub3
  88.  
  89. namespace Sub4 {
  90. int minn = oo;
  91.  
  92. void solve() {
  93.    for(int i = 1; i <= n; i++)
  94.       minn = min(minn, a[i]);
  95.  
  96.    for(int i = 1; i <= q; ++i) {
  97.       int k, u, v;
  98.       cin >> k >> u >> v;
  99.       if(k == 1) a[u] = v;
  100.       else cout << min(a[u] * a[v], a[u]*minn + a[v]*minn) << '\n';
  101.    }
  102. }
  103. }//namespace Sub4
  104.  
  105. int main() {
  106. #ifdef LOCAL
  107.    freopen("in.txt", "r", stdin);
  108. #else
  109.    freopen("MULTIGRAPH.inp", "r", stdin);
  110.    freopen("MULTIGRAPH.out", "w", stdout);
  111. #endif
  112.    ios_base::sync_with_stdio(false);
  113.    cin.tie(0); cout.tie(0);
  114.  
  115.    cin >> n >> q;
  116.    for(int i = 1; i <= n; ++i)
  117.       cin >> a[i];
  118.  
  119.    if(n <= 500 && q <= 500)
  120.       Sub1::solve();
  121.    else if(n <= 100)
  122.       Sub3::solve();
  123.    else
  124.       Sub4::solve();
  125.  
  126.    return 0;
  127. }
  128.  
Add Comment
Please, Sign In to add comment