Submission #391821

#TimeUsernameProblemLanguageResultExecution timeMemory
391821cheissmartCake (CEOI14_cake)C++14
100 / 100
1752 ms77988 KiB
#include <bits/stdc++.h> #define F first #define S second #define PB push_back #define MP make_pair #define EB emplace_back #define V vector #define ALL(v) (v).begin(), (v).end() #define debug(x) cerr << "LINE(" << __LINE__ << ") ->" << #x << " is " << x << endl using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef V<int> vi; const int INF = 1e9 + 7, N = 1e6 + 7; int d[N], rk[N], vis[N], l[N], r[N], n; vi G[N], topo; void dfs(int u) { vis[u] = 1; for(int v:G[u]) if(!vis[v]) dfs(v); topo.PB(u); } int t[N * 4]; void upd(int pos, int val, int v = 1, int tl = 0, int tr = n) { if(tl >= tr) exit(0); if(tr - tl == 1) { t[v] = val; return; } int tm = (tl + tr) / 2; if(pos < tm) upd(pos, val, v * 2, tl, tm); else upd(pos, val, v * 2 + 1, tm, tr); t[v] = min(t[v * 2], t[v * 2 + 1]); } int qry(int l, int r, int v = 1, int tl = 0, int tr = n) { if(l <= tl && tr <= r) { return t[v]; } int tm = (tl + tr) / 2; int ans = INF; if(l < tm) ans = min(ans, qry(l, r, v * 2, tl, tm)); if(r > tm) ans = min(ans, qry(l, r, v * 2 + 1, tm, tr)); return ans; } signed main() { ios::sync_with_stdio(0), cin.tie(0); int a; cin >> n >> a, a--; for(int i = 0; i < n; i++) { cin >> d[i]; } vi p(n); iota(ALL(p), 0); sort(ALL(p), [&] (int a, int b) { return d[a] > d[b]; }); int q; cin >> q; int s = n + q, t = s + 1; auto add_edge = [&] (int u, int v) { G[u].PB(v); r[u] = v; l[v] = u; }; for(int i = 1; i < n; i++) add_edge(p[i - 1], p[i]); add_edge(s, p[0]); add_edge(p[n - 1], t); V<array<int, 2>> qq; { vi who(n); iota(ALL(who), 0); int new_node = n; for(int i = 0; i < q; i++) { char op; cin >> op; if(op == 'F') { int x; cin >> x, x--; qq.PB({1, x}); } else { int x, y; cin >> x >> y, x--; qq.PB({2, x}); int u = who[x]; add_edge(l[u], r[u]); u = who[x] = new_node++; int ptr = s; for(int j = 0; j < y; j++) ptr = r[ptr]; add_edge(l[ptr], u); add_edge(u, ptr); } } } dfs(s); reverse(ALL(topo)); for(int i = 0; i < topo.size(); i++) { rk[topo[i]] = i; } { for(int i = 0; i < n; i++) upd(i, rk[i]); int new_node = n; for(int i = 0; i < q; i++) { if(qq[i][0] == 1) { int x = qq[i][1]; if(x == a) { cout << 0 << '\n'; } else if(x > a) { int mn = qry(a + 1, x + 1); int lb = 0, rb = a - 1; while(lb <= rb) { int mb = (lb + rb) / 2; if(qry(mb, a) > mn) rb = mb - 1; else lb = mb + 1; } cout << x - lb << '\n'; } else { int mn = qry(x, a); int lb = a + 1, rb = n - 1; while(lb <= rb) { int mb = (lb + rb) / 2; if(qry(a + 1, mb + 1) < mn) rb = mb - 1; else lb = mb + 1; } cout << rb - x << '\n'; } } else { int x = qq[i][1]; upd(x, rk[new_node++]); } } } }

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:110:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |     for(int i = 0; i < topo.size(); i++) {
      |                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...