diff --git a/contests/SBC19/F.cpp b/contests/SBC19/F.cpp
index daea4fc898397648f27a7ad06b3a21ef0f447200..6e6fc57044bbad5fa8d14f2e038774fa1eaf22b0 100644
--- a/contests/SBC19/F.cpp
+++ b/contests/SBC19/F.cpp
@@ -26,40 +26,32 @@ using ii = pair<int,int>;
 int N = 100001;
 int tree[MAX*4], cnt[MAX*4];
 
-struct LazySegmentTree {
-  void init() {
-    mset(tree, 0);
-    mset(cnt, 0);
+void update(int i, int j, int val, 
+    int node = 1, int l = 0, int r = N - 1) {
+  if (l > r || l > j || r < i) return;
+
+  if (i <= l && r <= j)
+    tree[node] += val;
+  else {
+    int m = (l + r) / 2;
+    update(i, j, val, left(node), l, m);
+    update(i, j, val, right(node), m + 1, r);
   }
 
-  void update(int i, int j, int val, 
-      int node = 1, int l = 0, int r = N - 1) {
-    if (l > r || l > j || r < i) return;
-
-    if (i <= l && r <= j)
-      tree[node] += val;
-    else {
-      int m = (l + r) / 2;
-      update(i, j, val, left(node), l, m);
-      update(i, j, val, right(node), m + 1, r);
-    }
-
-    if (tree[node])
-      cnt[node] = r - l + 1;
-    else {
-      cnt[node] = 0;
-      if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)];
-    }
+  if (tree[node])
+    cnt[node] = r - l + 1;
+  else {
+    cnt[node] = 0;
+    if (l < r) cnt[node] = cnt[left(node)] + cnt[right(node)];
   }
-};
+}
 
 struct Segment {
   int x1, y1, x2, y2;
 
   Segment() {}
   Segment(int x1, int y1, int x2, int y2) :
-    x1(x1), y1(y1), x2(x2), y2(y2)
-  {}
+    x1(x1), y1(y1), x2(x2), y2(y2) {}
 };
 
 struct Event {
@@ -74,10 +66,11 @@ struct Event {
 Segment rect;
 vector<Event> E;
 vector<Segment> ss;
-LazySegmentTree seg;
 
-double calc(int m) {
-  seg.init();
+double calc(int m, ll p) {
+  mset(tree, 0);
+  mset(cnt, 0);
+
   int k = 0;
   for (int i = 0; i < ss.size(); ++i) {
     E[k++] = Event(ss[i].x1 - m, ss[i].x2 + m, ss[i].y1 - m,  1);
@@ -93,11 +86,11 @@ double calc(int m) {
   for (int i = rect.y1; i < rect.y2; ++i) {
     for (; k < E.size() && E[k].y <= i; ++k)
       if (E[k].x1 <= rect.x2 - 1 && E[k].x2 >= rect.x1)
-        seg.update(max(rect.x1, E[k].x1), min(rect.x2 - 1, E[k].x2 - 1), E[k].beg);
+        update(max(rect.x1, E[k].x1), min(rect.x2 - 1, E[k].x2 - 1), E[k].beg);
     ans += (ll) cnt[1];
   }
 
-  return ((ans*100) / ((ll) ((ll) rect.x2 - rect.x1) * ((ll) rect.y2 - rect.y1)));
+  return (ans*100) < p * ((ll) ((ll) rect.x2 - rect.x1) * ((ll) rect.y2 - rect.y1));
 }
 
 int main() {
@@ -114,14 +107,14 @@ int main() {
     i = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2));
   }
 
-  int p; cin >> p;
+  ll p; cin >> p;
   int x1, y1, x2, y2;
   cin >> x1 >> y1 >> x2 >> y2;
   rect = Segment(min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2));
 
   int l = 0, r = 101010;
   for (int b = r / 2; b >= 1; b /= 2)
-    while (calc(l + b) < p)
+    while (calc(l + b, p))
       l += b;
 
   cout << l + 1 << ende;
diff --git a/contests/SBC19/G.cpp b/contests/SBC19/G.cpp
index 87d8d6f08e7358644afd0c8588b98e4d72ed6a9d..2c8ce39e7a557f400e9f28dac5cfc698c73c6f65 100644
--- a/contests/SBC19/G.cpp
+++ b/contests/SBC19/G.cpp
@@ -105,7 +105,7 @@ int main() {
       double x; cin >> x; 
       mcmf.add_edge(i+1, j+1+n, 1, -log(x));
     }
-    mcmf.add_edge(i+n+1,2*n+1, 1, 0);
+    mcmf.add_edge(i+n+1, 2*n+1, 1, 0);
   }
 
   vector<int> ans(n);
diff --git a/contests/SBC19/I.cpp b/contests/SBC19/I.cpp
index 44fcd8cf8dee158b2521d94670e30a6787761fe8..0f929cb156139ea3b366a708ecc0df7276242a0b 100644
--- a/contests/SBC19/I.cpp
+++ b/contests/SBC19/I.cpp
@@ -20,65 +20,66 @@ using namespace std;
 using ll = long long;
 using ii = pair<int,int>;
 
-int graph[MAX][MAX];
-int dist[2][MAX][MAX][MAX];
+int dist[2][MAX][MAX];
+
+struct Query { int idx, a, b, k, t; };
 
 int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
 
   int n, r; cin >> n >> r;
-
-  vector<ii> t(n);
+  vector<ii> T[2];
   for (int i = 0; i < n; ++i) {
-    cin >> t[i].fi;
-    t[i].se = i;
+    int x; cin >> x;
+    T[0].pb({x, i});
+    T[1].pb({x, i});
+    dist[0][i][i] = dist[1][i][i] = 0;
   }
 
-  vector<ii> t0 = t;
-  vector<ii> t1 = t;
-
-  sort(all(t0));
-  sort(rall(t1));
+  sort(all(T[0]));
+  sort(rall(T[1]));
 
+  mset(dist, inf);
   for (int i = 0; i < r; ++i) {
     int a, b, c; cin >> a >> b >> c; a--, b--;
-    graph[a][b] = c;
-    graph[b][a] = c;
+    dist[0][a][b] = dist[1][a][b] = c;
+    dist[0][b][a] = dist[1][b][a] = c;
   }
 
-  mset(dist, inf);
-  for (int i = 0; i < n; ++i)
-    for (int j = 0; j < n; ++j)
-      if (i == j) 
-        dist[0][0][i][j] = dist[1][0][i][j] = 0;
-      else if (graph[i][j]) 
-        dist[0][0][i][j] = dist[1][0][i][j] = graph[i][j];
-
-  int kk0 = 1, kk1 = 1;
-  for (int k = 0; k < n; ++k) {
-    if (k && t0[k].fi != t0[k-1].fi) kk0++;
-    if (k && t1[k].fi != t1[k-1].fi) kk1++;
-
-    for (int i = 0; i < n; ++i)
-      for (int j = 0; j < n; ++j) {
-        dist[0][kk0][i][j] = min({dist[0][kk0-1][i][j], dist[0][kk0-1][i][t0[k].se] + dist[0][kk0-1][t0[k].se][j], 
-                                  dist[0][kk0][i][j],   dist[0][kk0][i][t0[k].se]   + dist[0][kk0][t0[k].se][j]});
-        dist[1][kk1][i][j] = min({dist[1][kk1-1][i][j], dist[1][kk1-1][i][t1[k].se] + dist[1][kk1-1][t1[k].se][j], 
-                                  dist[1][kk1][i][j],   dist[1][kk1][i][t1[k].se]   + dist[1][kk1][t1[k].se][j]});
-      }
+  int q; cin >> q;
+  vector<Query> Q(q);
+  for (int i = 0; i < q; ++i) {
+    int a, b, k, t; cin >> a >> b >> k >> t; a--, b--;
+    Q[i] = Query{i, a, b, k, t};
   }
 
-  for (int k = kk0 + 1; k <= n; ++k)
-    memcpy(dist[0][k], dist[0][k-1], sizeof dist[0][k]);
-  for (int k = kk1 + 1; k <= n; ++k)
-    memcpy(dist[1][k], dist[1][k-1], sizeof dist[1][k]);
+  sort(all(Q), [&](Query a, Query b) {
+    if (a.t == b.t) return a.k < b.k;
+    return a.t < b.t;
+  });
+  
+  int curr = 0;
+  vector<int> ans(q);
+  for (int tt = 0; tt <= 1; ++tt) {
+    int kk = 1;
+    for (int k = 0; k < n; ++k) {
+      if (k && T[tt][k].fi != T[tt][k-1].fi) {
+        for (; curr < q && Q[curr].k == kk && Q[curr].t == tt; ++curr)
+          ans[Q[curr].idx] = dist[tt][Q[curr].a][Q[curr].b];
+        kk++;
+      }
+
+      for (int i = 0; i < n; ++i)
+        for (int j = 0; j < n; ++j)
+          dist[tt][i][j] = min(dist[tt][i][j], dist[tt][i][T[tt][k].se] + dist[tt][T[tt][k].se][j]);
+    }
 
-  int q; cin >> q;
-  while (q--) {
-    int a, b, k, t; cin >> a >> b >> k >> t; a--, b--;
-    cout << ((dist[t][k][a][b] == inf) ? -1 : dist[t][k][a][b]) << ende;
+    for (; curr < q && Q[curr].t == tt; ++curr)
+      ans[Q[curr].idx] = dist[tt][Q[curr].a][Q[curr].b];
   }
 
+  for (auto i : ans)
+    cout << ((i == inf) ? -1 : i) << ende;
   return 0;
 }