diff --git a/algorithms/graph/kruskal.cpp b/algorithms/graph/kruskal.cpp
index 383808ea7d1dd5e3cb483c5fba07c0ac0bec8a2e..d6b05e0e8c4604dbaa8373bb8b5a6eb0d578b3a0 100644
--- a/algorithms/graph/kruskal.cpp
+++ b/algorithms/graph/kruskal.cpp
@@ -12,15 +12,12 @@
 vector<iii> mst; // Result
 vector<iii> edges;
 
-bool cmp(iii a, iii b) { 
-  return a.se < b.se;
-  //* return a.se > b.se
-}
-
-
 // Return value of MST and build mst vector with edges that belong to the tree
 int kruskal() {
-  sort(all(edges), cmp);
+  sort(all(edges), [&](const iii &a, const iii &b) {
+    return a.se < b.se;
+    //* return a.se > b.se
+  });
 
   int size = 0;
   for (int i = 0; i < MAX; i++)
diff --git a/algorithms/graph/lca.cpp b/algorithms/graph/lca.cpp
index 32a2fcee0e90520ea7d25c3cbb50912e0164ce43..6bfb144c8cbedf4cbd0dee609db2b436878ef997 100644
--- a/algorithms/graph/lca.cpp
+++ b/algorithms/graph/lca.cpp
@@ -42,8 +42,8 @@ void dfs(int v, int p = -1, int c = 0) {
 
 // Preprocess tree rooted at v
 void preprocess(int v) {
-  memset(par, -1, sizeof par);
-  //*** memset(cost, 0, sizeof cost);
+  mset(par, -1);
+  //*** mset(cost, 0;
   dfs(v);
 }
 
diff --git a/contests/ICPC_SA17/C.cpp b/contests/ICPC_SA17/C.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8503489d76e01a89b3011a4e4e363037e93d05b7
--- /dev/null
+++ b/contests/ICPC_SA17/C.cpp
@@ -0,0 +1,60 @@
+#include <bits/stdc++.h>
+
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+typedef long long ll;
+typedef pair<int,int> ii;
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  int n, k; cin >> k >> n;
+  vector<int> cnt(k + 1);
+  for (int i = 0; i < n; ++i) {
+    int x; cin >> x; cnt[x]++;
+  }
+
+  set<int> S;
+  vector<int> v;
+
+  for (int i = 1; i <= k; ++i) S.insert(cnt[i]);
+  for (auto i : S) v.pb(i);
+
+  auto find_cnt = [&](int x) {
+    for (int i = 1; i <= k; ++i)
+      if (cnt[i] == x)
+        return i;
+
+    assert(false);
+  };
+
+
+  int flo = n / k;
+  int cei = (n - 1) / k + 1;
+
+  if (n % k == 0 && (v.size() == 3 && v[0] == v[1] - 1 && v[1] == v[2] - 1))
+    cout << "-" << find_cnt(v[2]) << " " << "+" << find_cnt(v[0]) << ende;
+  else if (flo * k + 1 == n && (v.size() == 2 && v[0] == v[1] - 1))
+    cout << "-" << find_cnt(v[1]) << ende;
+  else if (cei * k - 1 == n && (v.size() == 2 && v[0] == v[1] - 1))
+    cout << "+" << find_cnt(v[0]) << ende;
+  else
+    cout << "*" << ende;
+
+  return 0;
+}
diff --git a/contests/ICPC_SA17/E.cpp b/contests/ICPC_SA17/E.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7f1565986514fd51d9ac2f53250ffd5bad57d535
--- /dev/null
+++ b/contests/ICPC_SA17/E.cpp
@@ -0,0 +1,58 @@
+#include <bits/stdc++.h>
+
+#define MAX 1010
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+typedef long long ll;
+typedef pair<int,int> ii;
+
+int n;
+string s;
+int dp[MAX][MAX];
+
+bool solve(int i, int r) {
+  if (i == s.size())
+    return (r % n == 0);
+
+  if (dp[i][r] != -1)
+    return dp[i][r];
+
+  if (s[i] == '?') {
+    for (int j = (i == 0); j <= 9; ++j)
+      if (solve(i + 1, (r * 10 + j) % n)) {
+        s[i] = j + '0';
+        return dp[i][r] = true;
+      }
+  } else {
+    if (solve(i + 1, (r * 10 + (s[i] - '0')) % n))
+      return dp[i][r] = true;
+  }
+
+  return dp[i][r] = false;
+}
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  cin >> s >> n;
+  mset(dp, -1);
+
+  cout << (!solve(0, 0) ? "*" : s) << ende;
+  return 0;
+}
+
diff --git a/contests/ICPC_SA17/H.cpp b/contests/ICPC_SA17/H.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f4449e79a226cd9599ce9bf1105d2059cb913929
--- /dev/null
+++ b/contests/ICPC_SA17/H.cpp
@@ -0,0 +1,31 @@
+#include <bits/stdc++.h>
+
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+typedef long long ll;
+typedef pair<int,int> ii;
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  int a, b, c; cin >> a >> b >> c;
+  int d, e, f; cin >> d >> e >> f;
+
+  cout << max(0, d - a) + max(0, e - b) + max(0, f - c) << ende;
+  return 0;
+}
diff --git a/contests/ICPC_SA17/I.cpp b/contests/ICPC_SA17/I.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4335b4aabb9843f9b81d9129fc8dd12c817b8a76
--- /dev/null
+++ b/contests/ICPC_SA17/I.cpp
@@ -0,0 +1,174 @@
+#include <bits/stdc++.h>
+
+#define MAX 201010
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+typedef long long ll;
+typedef pair<int,int> ii;
+typedef pair<ii,int> iii;
+
+map<ii, bool> mst;
+vector<ii> graph[MAX];
+vector<iii> edges;
+
+int pare[MAX];
+int size[MAX];
+
+void make_set(int x) {
+  pare[x] = x;
+  size[x] = 1;
+}
+
+
+int find_set(int x) {
+  if (pare[x] != x)
+    pare[x] = find_set(pare[x]);
+  return pare[x];
+}
+
+
+void union_set(int x, int y) {
+  x = find_set(x);
+  y = find_set(y);
+
+  if (x == y)
+    return;
+
+  if (size[x] > size[y])
+    swap(x, y);
+
+  pare[x] = y;
+  size[y] += size[x];
+}
+
+
+int kruskal() {
+  sort(all(edges), [&](const iii &a, const iii &b) {
+    return a.se < b.se;    
+  });
+
+  int ans = 0;
+  for (int i = 0; i < MAX; i++)
+    make_set(i);
+
+  for (int i = 0; i < edges.size(); i++) {
+    int pu = find_set(edges[i].fi.fi);
+    int pv = find_set(edges[i].fi.se);
+
+    if (pu != pv) {
+      mst[edges[i].fi] = true;
+
+      graph[edges[i].fi.fi].pb(ii(edges[i].fi.se, edges[i].se));
+      graph[edges[i].fi.se].pb(ii(edges[i].fi.fi, edges[i].se));
+
+      ans += edges[i].se;
+      union_set(pu, pv);
+    }
+  }
+
+  return ans;
+}
+
+#define MAXLOG 20
+
+int h[MAX];
+int par[MAX][MAXLOG];
+int cost[MAX][MAXLOG];
+
+void dfs(int v, int p = -1, int c = 0) {
+  par[v][0] = p;
+  cost[v][0] = c;
+
+  if (p != -1)
+    h[v] = h[p] + 1;
+
+  for (int i = 1; i < MAXLOG; ++i)
+    if (par[v][i - 1] != -1) {
+      par[v][i] = par[par[v][i - 1]][i - 1];
+      cost[v][i] = max(cost[v][i], max(cost[par[v][i-1]][i-1], cost[v][i-1]));
+    }
+
+  for (auto u : graph[v]) 
+    if (p != u.fi)
+      dfs(u.fi, v, u.se);
+}
+
+
+void preprocess(int v) {
+  memset(par, -1, sizeof par);
+  memset(cost, 0, sizeof cost);
+  dfs(v);
+}
+
+
+int query(int p, int q) {
+  int ans = 0;
+
+  if (h[p] < h[q])
+    swap(p, q);
+
+  for (int i = MAXLOG - 1; i >= 0; --i)
+    if (par[p][i] != -1 && h[par[p][i]] >= h[q]) {
+      ans = max(ans, cost[p][i]);
+      p = par[p][i];
+    }
+
+  if (p == q)
+    return ans;
+
+  for (int i = MAXLOG - 1; i >= 0; --i)
+    if (par[p][i] != -1 && par[p][i] != par[q][i]) {
+      ans = max(ans, max(cost[p][i], cost[q][i]));
+      p = par[p][i];
+      q = par[q][i];
+    }
+
+  if (p == q) return ans;
+  else return max(ans, max(cost[p][0], cost[q][0]));
+}
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  int n, r; cin >> n >> r;
+  map<ii,int> M;
+  for (int i = 0; i < r; ++i) {
+    int a, b, c; cin >> a >> b >> c;
+    a--, b--;
+    M[ii(a, b)] = c;
+    M[ii(b, a)] = c;
+    edges.pb(iii(ii(a, b), c));
+    edges.pb(iii(ii(b, a), c));
+  }
+
+  int vmst = kruskal();
+  preprocess(0);
+
+  int q; cin >> q;
+  for (int i = 0; i < q; ++i) {
+    int a, b; cin >> a >> b;
+    a--, b--;
+
+    if (mst[ii(a, b)] || mst[ii(b, a)])
+      cout << vmst << ende;
+    else
+      cout << vmst - query(a, b) + M[ii(a, b)] << ende;
+  }
+
+  return 0;
+}
diff --git a/contests/ICPC_SA17/a.out b/contests/ICPC_SA17/a.out
new file mode 100755
index 0000000000000000000000000000000000000000..bfe686fe7a6b3981e10c013b2d82a356a7be7cf7
Binary files /dev/null and b/contests/ICPC_SA17/a.out differ