Submission #1306768

#TimeUsernameProblemLanguageResultExecution timeMemory
1306768DangKhoizzzzNekameleoni (COCI15_nekameleoni)C++20
0 / 140
278 ms589824 KiB
#include <bits/stdc++.h> #define int long long #define fi first #define se second #define pii pair <int , int> #define arr3 array <int , 3> using namespace std; const int INF = 1e18; const int maxn = 4*2e5; int n, k, m; int limit; struct node{ int mxp[55], mnp[55], ans; node() { for(int i = 0; i < 55; i++) { mxp[i] = -INF; mnp[i] = INF; } ans = INF; } }; node st[maxn]; node join(const node &L, const node &R){ node res; res.ans = min(L.ans, R.ans); bool full = 1; int need = (1ll << k) - 1, mask = 0; vector <pii> a, b; a.reserve(k); b.reserve(k); for(int i = 0; i < k; i++) { res.mxp[i] = max(L.mxp[i], R.mxp[i]); res.mnp[i] = min(L.mnp[i], R.mnp[i]); if (L.mxp[i] != -INF) a.push_back({L.mxp[i], i}); if (R.mnp[i] != INF) b.push_back({R.mnp[i], i}); if(res.mxp[i] == -INF) full = 0; if(L.mxp[i] != -INF) mask |= (1ll << i); } if(!full) return res; sort(a.begin(), a.end()); sort(b.begin(), b.end()); int pos = 0, save = 0; for(int i = 0; i < a.size(); i++) { while((mask|save) != need && pos < b.size()) { save |= (1ll << b[pos].se); pos++; } if(pos != 0 && (mask|save) == need) { res.ans = min(res.ans, b[pos-1].fi - a[i].fi + 1); } mask ^= (1ll << a[i].se); } return res; } void update(int pos, int val){ int idx = pos + limit - 1; st[idx] = node(); st[idx].mxp[val] = pos; st[idx].mnp[val] = pos; for (idx /= 2; idx >= 1; idx /= 2){ st[idx] = join(st[2 * idx], st[2 * idx + 1]); } } void solve() { cin >> n >> k >> m; limit = 1; while(limit < n) limit <<= 1; for(int i = 1; i <= n; i++) { int x; cin >> x; x--; int idx = i + limit - 1; st[idx] = node(); st[idx].mxp[x] = i; st[idx].mnp[x] = i; } for(int i = limit - 1; i >= 1; i--) { st[i] = join(st[2 * i], st[2 * i + 1]); } while(m--) { int t; cin >> t; if(t == 1) { int p , v; cin >> p >> v; v--; update(p, v); } else { if(k == 1) cout << 1 << '\n'; else cout << (st[1].ans == INF ? -1 : st[1].ans) << '\n'; } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("inp.txt", "r", stdin); freopen("out.txt", "w", stdout); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...