/**
* author: wxhtzdy
* created: 28.06.2022 12:53:33
**/
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const int K = 55;
int mn[4 * N], sz_l[4 * N], sz_r[4 * N];
pair<int, int> ll[4 * N][K];
pair<int, int> rr[4 * N][K];
int readint(){
int x=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main() {
int n, k, q;
n = readint();
k = readint();
q = readint();
vector<int> a(n);
for (int i = 0; i < n; i++) {
a[i] = readint();
--a[i];
}
const int inf = (int) 1e6;
for (int i = 0; i < 4 * n; i++) {
mn[i] = inf;
sz_l[i] = sz_r[i] = 0;
}
function<void(int, int, int)> pull = [&](int node, int l, int r) {
{
sz_l[node] = 0;
long long seen = 0;
int i = 0, j = 0;
function<void(pair<int, int>)> Insert = [&](pair<int, int> v) {
if (!(seen >> v.second & 1)) {
seen = seen | (1LL << v.second);
ll[node][sz_l[node]++] = v;
}
};
while (i < sz_l[node + node] || j < sz_l[node + node + 1]) {
if (i == sz_l[node + node] || (j < sz_l[node + node + 1] && ll[node + node][i].first > ll[node + node + 1][j].first)) {
Insert(ll[node + node + 1][j++]);
} else {
Insert(ll[node + node][i++]);
}
}
}
{
sz_r[node] = 0;
long long seen = 0;
int i = sz_r[node + node] - 1, j = sz_r[node + node + 1] - 1;
function<void(pair<int, int>)> Insert = [&](pair<int, int> v) {
if (!(seen >> v.second & 1)) {
seen = seen | (1LL << v.second);
rr[node][sz_r[node]++] = v;
}
};
while (i >= 0 || j >= 0) {
if (i < 0 || (j >= 0 && rr[node + node][i].first < rr[node + node + 1][j].first)) {
Insert(rr[node + node + 1][j--]);
} else {
Insert(rr[node + node][i--]);
}
}
reverse(rr[node], rr[node] + sz_r[node]);
}
mn[node] = min(mn[node + node], mn[node + node + 1]);
vector<int> cnt(k);
int d = 0;
function<void(int)> Add = [&](int x) {
if (cnt[x] == 0) {
d += 1;
}
cnt[x] += 1;
};
function<void(int)> Rem = [&](int x) {
cnt[x] -= 1;
if (cnt[x] == 0) {
d -= 1;
}
};
for (int i = 0; i < sz_r[node + node]; i++) {
Add(rr[node + node][i].second);
}
int ptr = 0;
for (int i = 0; i < sz_r[node + node]; i++) {
auto& p = rr[node + node][i];
while (ptr < sz_l[node + node + 1] && d < k) {
Add(ll[node + node + 1][ptr].second);
ptr += 1;
}
if (d == k) {
int b = (ptr == 0 ? rr[node + node][sz_r[node + node] - 1].first : ll[node + node + 1][ptr - 1].first);
mn[node] = min(mn[node], b - p.first + 1);
}
Rem(p.second);
}
};
function<void(int, int, int)> build = [&](int node, int l, int r) {
if (l == r) {
sz_l[node] = 0;
sz_r[node] = 0;
ll[node][sz_l[node]++] = make_pair(l, a[l]);
rr[node][sz_r[node]++] = make_pair(r, a[r]);
mn[node] = (k == 1 ? 1 : inf);
return;
}
int mid = l + r >> 1;
build(node + node, l, mid);
build(node + node + 1, mid + 1, r);
pull(node, l, r);
};
function<void(int, int, int, int)> modify = [&](int node, int l, int r, int i) {
if (l == r) {
sz_l[node] = 0;
sz_r[node] = 0;
ll[node][sz_l[node]++] = make_pair(l, a[l]);
rr[node][sz_r[node]++] = make_pair(r, a[r]);
mn[node] = (k == 1 ? 1 : inf);
return;
}
int mid = l + r >> 1;
if (i <= mid) {
modify(node + node, l, mid, i);
} else {
modify(node + node + 1, mid + 1, r, i);
}
pull(node, l, r);
};
build(1, 0, n - 1);
while (q--) {
int op = readint();
if (op == 1) {
int i = readint();
int v = readint();
--i; --v;
a[i] = v;
modify(1, 0, n - 1, i);
} else {
cout << (mn[1] >= inf ? -1 : mn[1]) << '\n';
}
}
return 0;
}
Compilation message
nekameleoni.cpp: In lambda function:
nekameleoni.cpp:117:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
117 | int mid = l + r >> 1;
| ~~^~~
nekameleoni.cpp: In lambda function:
nekameleoni.cpp:131:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
131 | int mid = l + r >> 1;
| ~~^~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
26 ms |
7508 KB |
Output is correct |
2 |
Correct |
19 ms |
7564 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
61 ms |
9452 KB |
Output is correct |
2 |
Correct |
61 ms |
9460 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
106 ms |
14104 KB |
Output is correct |
2 |
Correct |
113 ms |
14096 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1053 ms |
57572 KB |
Output is correct |
2 |
Correct |
2899 ms |
160264 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1506 ms |
116236 KB |
Output is correct |
2 |
Execution timed out |
3061 ms |
230864 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2120 ms |
115588 KB |
Output is correct |
2 |
Execution timed out |
3100 ms |
228400 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2507 ms |
116696 KB |
Output is correct |
2 |
Execution timed out |
3060 ms |
230404 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2465 ms |
116448 KB |
Output is correct |
2 |
Execution timed out |
3089 ms |
230872 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3013 ms |
231324 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
3038 ms |
231312 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |