diff --git a/1a-destruction/sol2_loop.cpp b/1a-destruction/sol2_loop.cpp new file mode 100644 index 0000000..a4adf87 --- /dev/null +++ b/1a-destruction/sol2_loop.cpp @@ -0,0 +1,40 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int K = 1010; + +ll A[N], dp[K][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + ll tt = 0; + for (int i = 1; i <= n; ++i) { + scanf("%lld", &A[i]); + tt += A[i]; + } + + for (int i = 1; i <= k; ++i) { + dp[i][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[i][j] = dp[i][j-1]; + for (int l = 1; l <= j-m+1; ++l) { + ll sum = 0; + for (int h = l; h <= j; ++h) + sum += A[h]; + dp[i][j] = min(dp[i][j], dp[i-1][max(0, l-2)] + sum); + } + } + } + + printf("%lld\n", tt-dp[k][n]); + + return 0; +} \ No newline at end of file diff --git a/1a-destruction/sol3_qs.cpp b/1a-destruction/sol3_qs.cpp new file mode 100644 index 0000000..f6dfac3 --- /dev/null +++ b/1a-destruction/sol3_qs.cpp @@ -0,0 +1,35 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int K = 1010; + +ll A[N], qs[N], dp[K][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + for (int i = 1; i <= n; ++i) { + scanf("%lld", &A[i]); + qs[i] = qs[i-1]+A[i]; + } + + for (int i = 1; i <= k; ++i) { + dp[i][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[i][j] = dp[i][j-1]; + for (int l = 1; l <= j-m+1; ++l) + dp[i][j] = min(dp[i][j], dp[i-1][max(0, l-2)] + qs[j]-qs[l-1]); + } + } + + printf("%lld\n", qs[n]-dp[k][n]); + + return 0; +} \ No newline at end of file diff --git a/1a-destruction/sol3_run.cpp b/1a-destruction/sol3_run.cpp new file mode 100644 index 0000000..2f33697 --- /dev/null +++ b/1a-destruction/sol3_run.cpp @@ -0,0 +1,40 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int K = 1010; + +ll A[N], dp[K][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + ll tt = 0; + for (int i = 1; i <= n; ++i) { + scanf("%lld", &A[i]); + tt += A[i]; + } + + for (int i = 1; i <= k; ++i) { + dp[i][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[i][j] = dp[i][j-1]; + ll sum = 0; + for (int l = j; l >= 1; --l) { + sum += A[l]; + if (l <= j-m+1) + dp[i][j] = min(dp[i][j], dp[i-1][max(0, l-2)] + sum); + } + } + } + + printf("%lld\n", tt-dp[k][n]); + + return 0; +} \ No newline at end of file diff --git a/1a-destruction/sol4_noa.cpp b/1a-destruction/sol4_noa.cpp new file mode 100644 index 0000000..b216de1 --- /dev/null +++ b/1a-destruction/sol4_noa.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int K = 1010; + +ll qs[N], dp[K][N], pmin[K][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + pmin[0][0] = INF; + for (int i = 1; i <= n; ++i) { + scanf("%lld", &qs[i]); + qs[i] += qs[i-1]; + pmin[0][i] = min(pmin[0][i-1], -qs[i-1]); + } + + for (int i = 1; i <= k; ++i) { + dp[i][0] = INF; + pmin[i][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[i][j] = dp[i][j-1]; + if (j-m+1 >= 1) + dp[i][j] = min(dp[i][j], pmin[i-1][j-m+1] + qs[j]); + pmin[i][j] = min(pmin[i][j-1], dp[i][max(j-2, 0)] - qs[j-1]); + } + } + + printf("%lld\n", qs[n]-dp[k][n]); + + return 0; +} \ No newline at end of file diff --git a/1a-destruction/sol4_pmin.cpp b/1a-destruction/sol4_pmin.cpp new file mode 100644 index 0000000..199facb --- /dev/null +++ b/1a-destruction/sol4_pmin.cpp @@ -0,0 +1,39 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int K = 1010; + +ll A[N], qs[N], dp[K][N], pmin[K][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + pmin[0][0] = INF; + for (int i = 1; i <= n; ++i) { + scanf("%lld", &A[i]); + qs[i] = qs[i-1]+A[i]; + pmin[0][i] = min(pmin[0][i-1], -qs[i-1]); + } + + for (int i = 1; i <= k; ++i) { + dp[i][0] = INF; + pmin[i][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[i][j] = dp[i][j-1]; + if (j-m+1 >= 1) + dp[i][j] = min(dp[i][j], pmin[i-1][j-m+1] + qs[j]); + pmin[i][j] = min(pmin[i][j-1], dp[i][max(j-2, 0)] - qs[j-1]); + } + } + + printf("%lld\n", qs[n]-dp[k][n]); + + return 0; +} \ No newline at end of file diff --git a/1a-destruction/sol5_opt.cpp b/1a-destruction/sol5_opt.cpp new file mode 100644 index 0000000..e6b9377 --- /dev/null +++ b/1a-destruction/sol5_opt.cpp @@ -0,0 +1,40 @@ +#include +using namespace std; + +using ll = long long; + +const ll INF = 1e17; +const int N = 100010; +const int M = 100010; +const int K = 1010; + +ll A[N], qs[N], dp[2][N], pmin[2][N]; + +int main() +{ + int n, k, m; + scanf("%d%d%d", &n, &k, &m); + + pmin[0][0] = INF; + for (int i = 1; i <= n; ++i) { + scanf("%lld", &A[i]); + qs[i] = qs[i-1]+A[i]; + pmin[0][i] = min(pmin[0][i-1], -qs[i-1]); + } + + for (int i = 1; i <= k; ++i) { + int x = i&1; + dp[x][0] = INF; + pmin[x][0] = INF; + for (int j = 1; j <= n; ++j) { + dp[x][j] = dp[x][j-1]; + if (j-m+1 >= 1) + dp[x][j] = min(dp[x][j], pmin[x^1][j-m+1] + qs[j]); + pmin[x][j] = min(pmin[x][j-1], dp[x][max(j-2, 0)] - qs[j-1]); + } + } + + printf("%lld\n", qs[n]-dp[k&1][n]); + + return 0; +} \ No newline at end of file diff --git a/1b-copying/sol_aqua_dfs.cpp b/1b-copying/sol_aqua_dfs.cpp new file mode 100644 index 0000000..5228d5a --- /dev/null +++ b/1b-copying/sol_aqua_dfs.cpp @@ -0,0 +1,66 @@ +#include +using namespace std; + +using pii = pair; + +const int N = 200010; +const int M = 500010; + +int n, m, p; +bool vis[N]; +int num[N]; +vector G[N]; +pii P[M]; + +void dfs(int u, int k, int x) +{ + vis[u] = true; + num[u] = x; + for (auto v : G[u]) { + if (v.second < k && !vis[v.first]) + dfs(v.first, k, x); + } +} + +bool check(int k) +{ + fill(vis, vis+n+1, false); + for (int i = 1; i <= n; ++i) { + if (!vis[i]) + dfs(i, k, i); + } + for (int i = 0; i < p; ++i) { + if (num[P[i].first] == num[P[i].second]) + return false; + } + return true; +} + +int main() +{ + scanf("%d%d%d", &n, &m, &p); + for (int i = 0; i < m; ++i) { + int u, v, w; + scanf("%d%d%d", &u, &v, &w); + G[u].emplace_back(v, w); + G[v].emplace_back(u, w); + } + for (int i = 0; i < p; ++i) + scanf("%d%d", &P[i].first, &P[i].second); + + int b = 1; + int e = 1e9+1; + while (b < e) { + int mid = (b+e+1)/2; + if (check(mid)) + b = mid; + else + e = mid-1; + } + + if (e == 1e9+1) + e = -1; + printf("%d\n", e); + + return 0; +} \ No newline at end of file diff --git a/1b-copying/sol_plurm_dsu.cpp b/1b-copying/sol_plurm_dsu.cpp new file mode 100644 index 0000000..5ae5e8a --- /dev/null +++ b/1b-copying/sol_plurm_dsu.cpp @@ -0,0 +1,26 @@ +#include +using namespace std; + +const int N = 4e4+5; + +int n, m, p, u, v, w, ans, H[N]; +vector > g; +vector > q; + +int find(int x) { return H[x] = H[x] == x ? x : find(H[x]); } + +bool check(int m) { + for(int i = 1; i <= n; ++i) H[i] = i; + for(auto x : g) if(get<2>(x) < m) H[find(get<0>(x))] = find(get<1>(x)); + for(auto x : q) if(find(x.first) == find(x.second)) return false; + return true; +} + +int main() { + scanf("%d %d %d", &n, &m, &p); + while(m--) scanf("%d %d %d", &u, &v, &w), g.emplace_back(u, v, w); + while(p--) scanf("%d %d", &u, &v), q.emplace_back(u, v); + for(int i = 29; i >= 0; --i) if(check(ans|1< 1e9) puts("-1"); + else printf("%d\n", ans); +} \ No newline at end of file diff --git a/1c-maxsubsum/sol_main.cpp b/1c-maxsubsum/sol_main.cpp new file mode 100644 index 0000000..fcfe25a --- /dev/null +++ b/1c-maxsubsum/sol_main.cpp @@ -0,0 +1,18 @@ +#include +#define long long long +using namespace std; + +const int N = 1e5+5; + +int n, w, h; +long A[N], B[N]; + +int main() { + scanf("%d %d %d", &n, &w, &h); + for(int i = 1; i <= n; ++i) scanf("%lld", A+i), A[i] += A[i-1]; + for(int i = 1; i <= n; ++i) scanf("%lld", B+i), B[i] += B[i-1]; + long mx1 = 0, mx2 = 0; + for(int i = w; i <= n; ++i) mx1 = max(mx1, A[i] - A[i-w]); + for(int i = h; i <= n; ++i) mx2 = max(mx2, B[i] - B[i-h]); + printf("%lld\n", mx1 * h + mx2 * w); +} \ No newline at end of file diff --git a/2a-plagiarist/Plagiarist_BBST.cpp b/2a-plagiarist/Plagiarist_BBST.cpp new file mode 100644 index 0000000..61cd587 --- /dev/null +++ b/2a-plagiarist/Plagiarist_BBST.cpp @@ -0,0 +1,46 @@ +#include +using namespace std; + +struct item { + int cnt, val, prio; + item *l, *r; + item(int val) : cnt(1), val(val), prio(rand()), l(NULL), r(NULL) { } +}; + +using pitem = item*; +int cnt(pitem t) { return t ? t->cnt : 0; } +void upd_cnt(pitem t) { if(t) t->cnt = cnt(t->l) + cnt(t->r) + 1; } + +void split(pitem t, int key, pitem &l, pitem &r) { + if(!t) return void(l = r = NULL); + if(key <= cnt(t->l)) split(t->l, key, l, t->l), r = t; + else split(t->r, key - cnt(t->l) - 1, t->r, r), l = t; + upd_cnt(t); +} + +void merge(pitem &t, pitem l, pitem r) { + if(!l || !r) t = l ? l : r; + else if(l->prio > r->prio) merge(l->r, l->r, r), t = l; + else merge(r->l, l, r->l), t = r; + upd_cnt(t); +} + +int n; +pitem t; + +int main() { + srand(time(NULL)); + scanf("%d", &n); + for(int i = 1; i <= n; ++i) { + int now; scanf("%d", &now); + merge(t, t, new item(now)); + } + while(n--) { + int x; scanf("%d", &x); + pitem t1, t2, t3; + split(t, x-1, t1, t2); + split(t2, 1, t2, t3); + printf("%d\n", t2->val); + merge(t, t1, t3); + } +} \ No newline at end of file diff --git a/2a-plagiarist/Plagiarist_BIT_nlog^2n.cpp b/2a-plagiarist/Plagiarist_BIT_nlog^2n.cpp new file mode 100644 index 0000000..040dbc3 --- /dev/null +++ b/2a-plagiarist/Plagiarist_BIT_nlog^2n.cpp @@ -0,0 +1,38 @@ +#include +using namespace std; + +const int N = 1<<19; + +int n, A[N], t[N+1]; + +void update(int x) { + for(int i = x; i <= N; i += i&-i) t[i]--; +} + +int que(int x) { + int sum = 0; + for(int i = x; i != 0; i -= i&-i) sum += t[i]; + return sum; +} + +int query(int x) { + int l = 1, r = N; + while(l < r) { + int m = (l + r) >> 1; + if(que(m) >= x) r = m; + else l = m+1; + } + return l; +} + +int main() { + for(int i = 1; i <= N; ++i) t[i] = i&-i; + scanf("%d", &n); + for(int i = 1; i <= n; ++i) scanf("%d", A+i); + for(int i = 1; i <= n; ++i) { + int now; scanf("%d", &now); + int ret = query(now); + printf("%d\n", A[ret]); + update(ret); + } +} \ No newline at end of file diff --git a/2a-plagiarist/Plagiarist_BIT_nlogn.cpp b/2a-plagiarist/Plagiarist_BIT_nlogn.cpp new file mode 100644 index 0000000..3f67508 --- /dev/null +++ b/2a-plagiarist/Plagiarist_BIT_nlogn.cpp @@ -0,0 +1,32 @@ +#include +using namespace std; + +const int N = 1<<19; + +int n, A[N], t[N+1]; + +void update(int x) { + for(int i = x; i <= N; i += i&-i) t[i]--; +} + +int query(int x) { + int l = 1, r = N, c = 0; + while(l < r) { + int m = (l + r) >> 1; + if(t[m] + c >= x) r = m; + else l = m+1, c += t[m]; + } + return l; +} + +int main() { + for(int i = 1; i <= N; ++i) t[i] = i&-i; + scanf("%d", &n); + for(int i = 1; i <= n; ++i) scanf("%d", A+i); + for(int i = 1; i <= n; ++i) { + int now; scanf("%d", &now); + int ret = query(now); + printf("%d\n", A[ret]); + update(ret); + } +} \ No newline at end of file diff --git a/2a-plagiarist/sol_aqua_segt.cpp b/2a-plagiarist/sol_aqua_segt.cpp new file mode 100644 index 0000000..205d892 --- /dev/null +++ b/2a-plagiarist/sol_aqua_segt.cpp @@ -0,0 +1,55 @@ +#include +using namespace std; + +const int N = 2e5+10; + +int n; +int A[N], seg[N<<2]; + +void update(int i, int x, int p=1, int b=1, int e=n) { + if (b == e) { + ++seg[p]; + return; + } + int m = (b+e)/2; + if (i <= m) + update(i, x, p<<1, b, m); + else + update(i, x, p<<1|1, m+1, e); + seg[p] = seg[p<<1] + seg[p<<1|1]; +} + +int query(int l, int r, int p=1, int b=1, int e=n) { + if (b > e || b > r || e < l) + return 0; + if (b >= l && e <= r) + return seg[p]; + int m = (b+e)/2; + return query(l, r, p<<1, b, m) + query(l, r, p<<1|1, m+1, e); +} + +int main() +{ + scanf("%d", &n); + for (int i = 1; i <= n; ++i) + scanf("%d", &A[i]); + int nx = n; + while (nx--) { + int x; + scanf("%d", &x); + int b = 1; + int e = n; + while (b < e) { + int m = (b+e)/2; + int l = m; + if (l-query(1, m) >= x) + e = m; + else + b = m+1; + } + printf("%d\n", A[e]); + update(e, 1); + } + + return 0; +} \ No newline at end of file diff --git a/2b-worker/sol_main.cpp b/2b-worker/sol_main.cpp new file mode 100644 index 0000000..a1e15ad --- /dev/null +++ b/2b-worker/sol_main.cpp @@ -0,0 +1,56 @@ +#include +using namespace std; + +using ll = long long; +using pii = pair; +using edge = pair; + +const int N = 1010; + +int n, T[N], B[N]; +int parent[N]; + +int root(int u) +{ + if (parent[u] == u) + return u; + return parent[u] = root(parent[u]); +} + +bool merge(int u, int v) +{ + u = root(u); + v = root(v); + if (u != v) { + parent[u] = v; + return true; + } + return false; +} + +int main() +{ + scanf("%d", &n); + vector E; + for (int i = 1; i <= n; ++i) { + scanf("%d", &T[i]); + E.emplace_back(T[i], pii(0, i)); + parent[i] = i; + } + + for (int i = 1; i <= n; ++i) { + scanf("%d", &B[i]); + for (int j = 1; j < i; ++j) + E.emplace_back(B[i]+B[j], pii(i, j)); + } + + sort(E.begin(), E.end()); + ll sum = 0; + for (auto e : E) { + if (merge(e.second.first, e.second.second)) + sum += e.first; + } + printf("%lld\n", sum); + + return 0; +} \ No newline at end of file diff --git a/2c-osumapping/sol2_norm.cpp b/2c-osumapping/sol2_norm.cpp new file mode 100644 index 0000000..1bc61f8 --- /dev/null +++ b/2c-osumapping/sol2_norm.cpp @@ -0,0 +1,50 @@ +#include +using namespace std; + +using ll = long long; +using pii = pair; +using pli = pair; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int T = 10; + +vector G[N]; +bool visited[N]; +ll dist[N]; + +int main() +{ + int n, m, t, x, y; + scanf("%d%d%d%d%d", &n, &m, &t, &x, &y); + for (int i = 0; i < m; ++i) { + int u, v, w; + scanf("%d%d%d", &u, &v, &w); + G[u].emplace_back(v, w); + } + + for (int i = 1; i <= n; ++i) + dist[i] = INF; + dist[x] = 0; + priority_queue, greater > Q; + Q.emplace(dist[x], x); + while (!Q.empty()) { + ll d = Q.top().first; + int u = Q.top().second; + Q.pop(); + if (visited[u]) + continue; + visited[u] = true; + for (auto v : G[u]) { + if (!visited[v.first] && d+v.second < dist[v.first]) { + dist[v.first] = d+v.second; + Q.emplace(dist[v.first], v.first); + } + } + } + + printf("%lld\n", dist[y] == INF ? -1 : dist[y]); + + return 0; +} \ No newline at end of file diff --git a/2c-osumapping/sol4_lambda.cpp b/2c-osumapping/sol4_lambda.cpp new file mode 100644 index 0000000..63f7c9f --- /dev/null +++ b/2c-osumapping/sol4_lambda.cpp @@ -0,0 +1,56 @@ +#include +using namespace std; + +using ll = long long; +using pii = pair; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int T = 10; + +vector G[N]; +bool visited[N][T]; +ll dist[N][T]; + +int main() +{ + int n, m, t, x, y; + scanf("%d%d%d%d%d", &n, &m, &t, &x, &y); + for (int i = 0; i < m; ++i) { + int u, v, w; + scanf("%d%d%d", &u, &v, &w); + G[u].emplace_back(v, w); + } + + for (int i = 1; i <= n; ++i) { + for (int j = 0; j < t; ++j) + dist[i][j] = INF; + } + dist[x][1%t] = 0; + auto cmp = [&] (pii a, pii b) { + return dist[a.first][a.second] > dist[b.first][b.second]; + }; + priority_queue, decltype(cmp)> Q(cmp); + Q.emplace(x, 1); + while (!Q.empty()) { + int u = Q.top().first; + int k = Q.top().second; + ll d = dist[u][k]; + Q.pop(); + if (visited[u][k]) + continue; + visited[u][k] = true; + int nk = (k+1)%t; + for (auto v : G[u]) { + if (!visited[v.first][nk] && d+v.second < dist[v.first][nk]) { + dist[v.first][nk] = d+v.second; + Q.emplace(v.first, nk); + } + } + } + + printf("%lld\n", dist[y][0] == INF ? -1 : dist[y][0]); + + return 0; +} \ No newline at end of file diff --git a/2c-osumapping/sol4_lambdaeq.cpp b/2c-osumapping/sol4_lambdaeq.cpp new file mode 100644 index 0000000..2cb2b5e --- /dev/null +++ b/2c-osumapping/sol4_lambdaeq.cpp @@ -0,0 +1,56 @@ +#include +using namespace std; + +using ll = long long; +using pii = pair; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int T = 10; + +vector G[N]; +bool visited[N][T]; +ll dist[N][T]; + +int main() +{ + int n, m, t, x, y; + scanf("%d%d%d%d%d", &n, &m, &t, &x, &y); + for (int i = 0; i < m; ++i) { + int u, v, w; + scanf("%d%d%d", &u, &v, &w); + G[u].emplace_back(v, w); + } + + for (int i = 1; i <= n; ++i) { + for (int j = 0; j < t; ++j) + dist[i][j] = INF; + } + dist[x][1%t] = 0; + auto cmp = [&] (pii a, pii b) { + return dist[a.first][a.second] >= dist[b.first][b.second]; + }; + priority_queue, decltype(cmp)> Q(cmp); + Q.emplace(x, 1); + while (!Q.empty()) { + int u = Q.top().first; + int k = Q.top().second; + ll d = dist[u][k]; + Q.pop(); + if (visited[u][k]) + continue; + visited[u][k] = true; + int nk = (k+1)%t; + for (auto v : G[u]) { + if (!visited[v.first][nk] && d+v.second < dist[v.first][nk]) { + dist[v.first][nk] = d+v.second; + Q.emplace(v.first, nk); + } + } + } + + printf("%lld\n", dist[y][0] == INF ? -1 : dist[y][0]); + + return 0; +} \ No newline at end of file diff --git a/2c-osumapping/sol4_state.cpp b/2c-osumapping/sol4_state.cpp new file mode 100644 index 0000000..ad8e892 --- /dev/null +++ b/2c-osumapping/sol4_state.cpp @@ -0,0 +1,54 @@ +#include +using namespace std; + +using ll = long long; +using pii = pair; +using plii = pair; + +const ll INF = 1e17; +const int N = 10010; +const int M = 10010; +const int T = 10; + +vector G[N]; +bool visited[N][T]; +ll dist[N][T]; + +int main() +{ + int n, m, t, x, y; + scanf("%d%d%d%d%d", &n, &m, &t, &x, &y); + for (int i = 0; i < m; ++i) { + int u, v, w; + scanf("%d%d%d", &u, &v, &w); + G[u].emplace_back(v, w); + } + + for (int i = 1; i <= n; ++i) { + for (int j = 0; j < t; ++j) + dist[i][j] = INF; + } + dist[x][1%t] = 0; + priority_queue, greater > Q; + Q.emplace(dist[x][1], pii(x, 1)); + while (!Q.empty()) { + ll d = Q.top().first; + int u = Q.top().second.first; + int k = Q.top().second.second; + Q.pop(); + if (visited[u][k]) + continue; + visited[u][k] = true; + int nk = (k+1)%t; + for (auto v : G[u]) { + if (!visited[v.first][nk] && d+v.second < dist[v.first][nk]) { + dist[v.first][nk] = d+v.second; + Q.emplace(dist[v.first][nk], pii(v.first, nk)); + } + } + } + + printf("%lld\n", dist[y][0] == INF ? -1 : dist[y][0]); + + return 0; +} \ No newline at end of file diff --git a/PreTOI14 Editorial.docx b/PreTOI14 Editorial.docx new file mode 100644 index 0000000..143a230 Binary files /dev/null and b/PreTOI14 Editorial.docx differ diff --git a/PreTOI14 Editorial.pdf b/PreTOI14 Editorial.pdf new file mode 100644 index 0000000..bcb8950 Binary files /dev/null and b/PreTOI14 Editorial.pdf differ