This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 500;
int n, m, k;
int a[N];
struct tree {
tree *L, *R;
int val;
vector <pair <ll, int> > pf, sf;
tree () {
val = 1e9;
pf.clear();
sf.clear();
}
pair <pair <vector <pair <ll, int> >, vector <pair <ll, int> > >, int> combine(tree *lft, tree *rgt) {
vector <pair <ll, int> > res_pf, res_sf;
int cur_val = 1e9;
vector <pair <ll, int> > left, right;
left = (lft -> pf);
right = (rgt -> pf);
res_pf = left;
for (int i = 0; i < int(right.size()); ++i)
if ((res_pf.back().first | right[i].first) != res_pf.back().first)
res_pf.push_back(make_pair(res_pf.back().first | right[i].first, right[i].second));
left = (lft -> sf);
right = (rgt -> sf);
res_sf = right;
for (int i = 0; i < int(left.size()); ++i)
if ((res_sf.back().first | left[i].first) != res_sf.back().first)
res_sf.push_back(make_pair(res_sf.back().first | left[i].first, left[i].second));
left = (lft -> sf);
right = (rgt -> pf);
cur_val = min(lft -> val, rgt -> val);
int p = int(right.size()) - 1;
for (int i = 0; i < int(left.size()); ++i) {
while (p >= 0 && (left[i].first | right[p].first) == (1ll << k) - 1)
--p;
if (p + 1 < int(right.size()) && (left[i].first | right[p + 1].first) == (1ll << k) - 1)
cur_val = min(cur_val, right[p + 1].second - left[i].second + 1);
}
return make_pair(make_pair(res_pf, res_sf), cur_val);
}
void build(int l, int r) {
if (l > r)
return;
if (l == r) {
val = 1e9;
if (k == 1)
val = 1;
pf.push_back(make_pair((1ll << a[l]), l));
sf.push_back(make_pair((1ll << a[l]), l));
return;
}
int md = (l + r) >> 1;
L = new tree();
R = new tree();
L -> build(l, md);
R -> build(md + 1, r);
auto cur = combine(L, R);
pf = cur.first.first;
sf = cur.first.second;
val = cur.second;
}
void upd(int l, int r, int p, int v) {
if (l == r) {
val = 1e9;
if (k == 1)
val = 1;
a[l] = v;
pf[0] = sf[0] = make_pair((1ll << a[l]), l);
return;
}
int md = (l + r) >> 1;
if (p <= md) L -> upd(l, md, p, v);
else R -> upd(md + 1, r, p, v);
auto cur = combine(L, R);
pf = cur.first.first;
sf = cur.first.second;
val = cur.second;
}
/*void show(int l, int r) {
if (l > r)
return;
cerr << l + 1 << " " << r + 1 << "\n";
cerr << val << "\n";
for (int i = 0; i < int(pf.size()); ++i)
cerr << pf[i].first << " " << pf[i].second << "\n";
cerr << "---\n";
for (int i = 0; i < int(sf.size()); ++i)
cerr << sf[i].first << " " << sf[i].second << "\n";
cerr << "!--------------\n\n";
if (l == r)
return;
int md = (l + r) >> 1;
L -> show(l, md);
R -> show(md + 1, r);
}*/
};
int main() {
cin >> n >> k >> m;
for (int i = 0; i < n; ++i)
cin >> a[i], --a[i];
tree t;
t.build(0, n - 1);
//t.show(0, n - 1);
for (int i = 0; i < m; ++i) {
int type;
cin >> type;
if (type == 1) {
int p, v;
cin >> p >> v;
--p; --v;
t.upd(0, n - 1, p, v);
} else cout << (t.val == 1e9 ? -1 : t.val) << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |