QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#755248 | #964. Excluded Min | Hooch | WA | 2ms | 12068kb | C++23 | 4.9kb | 2024-11-16 16:51:02 | 2024-11-16 16:51:03 |
Judging History
answer
#include <bits/stdc++.h>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
constexpr int N = 5E5 + 5;
int n, q, a[N], ans[N];
std::vector<int> vec[N];
template<class Info, class Tag>
class LazySegmentTree {
public:
int n;
std::vector<Info> t;
std::vector<Tag> tag;
LazySegmentTree() {}
LazySegmentTree(int _n) {
init(_n, std::vector<Info>(n, {}));
}
LazySegmentTree(int _n, std::vector<Info> a) {
init(_n, a);
}
void pull(int x) {t[x] = t[x * 2] + t[x * 2 + 1];}
void init(int _n, std::vector<Info> a) {
n = _n;
t.assign((n + 1) << 2, {});
tag.assign((n + 1) << 2, {});
std::function<void(int, int, int)> build = [&](int x, int l, int r) {
if (l == r) {
t[x] = a[l];
return ;
}
int mid = (l + r) / 2;
build(x * 2, l, mid);
build(x * 2 + 1, mid + 1, r);
pull(x);
} ;
build(1, 1, n);
}
void apply(int x, Tag v) {
t[x].apply(v);
tag[x].apply(v);
}
void push(int x) {
apply(x * 2, tag[x]);
apply(x * 2 + 1, tag[x]);
tag[x] = {};
}
void modify(int x, int l, int r, int L, int R, Tag v) {
if (r < L || l > R) return ;
if (l >= L && r <= R) return apply(x, v);
int mid = (l + r) / 2; push(x);
modify(x * 2, l, mid, L, R, v);
modify(x * 2 + 1, mid + 1, r, L, R, v);
pull(x);
} ;
void modify(int L, int R, Tag v) {modify(1, 1, n, L, R, v);}
void modify(int pos, Tag v) {modify(pos, pos, v);}
void change(int x, int l, int r, int pos, Info v) {
if (l == r) return void(t[x] = v);
int mid = (l + r) / 2; push(x);
if (pos <= mid) change(x * 2, l, mid, pos, v);
else change(x * 2 + 1, mid + 1, r, pos, v);
pull(x);
}
void change(int pos, Info v) {change(1, 1, n, pos, v);}
Info query(int x, int l, int r, int L, int R) {
if (r < L || l > R) return {};
if (l >= L && r <= R) return t[x];
int mid = (l + r) / 2; push(x);
return query(x * 2, l, mid, L, R) + query(x * 2 + 1, mid + 1, r, L, R);
}
Info query(int L, int R) {return query(1, 1, n, L, R);}
} ;
struct Tag {
int tag = 0;
void apply(const Tag &v) {tag += v.tag;}
} ;
struct Info {
int max = -1E9, pos = 0;
void apply(const Tag &v) {max += v.tag;}
} ;
Info operator+(Info a, Info b) {
return (Info) {
std::max(a.max, b.max),
a.max > b.max ? a.pos : b.pos
} ;
}
LazySegmentTree<Info, Tag> seg1, seg2;
struct Fenwick {
int sum[N];
void add(int x, int val) {for (; x <= n; x += x & -x) sum[x] += val;}
int query(int x) {int res = 0; for (; x; x -= x & -x) res += sum[x]; return res;}
} fen;
struct Query {
int l, r;
int idx;
bool operator<(const Query &p) const {
return l == p.l ? r > p.r : l < p.l;
}
} b[N];
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n >> q;
for (int i = 1; i <= n; ++i) {
std::cin >> a[i];
vec[a[i]].push_back(i);
}
for (int i = 1; i <= q; ++i) {
std::cin >> b[i].l >> b[i].r;
b[i].idx = i;
}
std::sort(b + 1, b + 1 + q);
std::vector<Info> init(q + 1);
int max = 0;
std::set<std::array<int, 2>> pl, pr;
for (int i = 1; i <= q; ++i) {
if (max < b[i].r) {
max = b[i].r;
pl.insert({b[i].l, i});
pr.insert({b[i].r, i});
init[i].max = b[i].r - b[i].l + 1 - n;
}
init[i].pos = i;
}
seg1.init(q, init);
for (int i = 1; i <= n; ++i) fen.sum[i] = (i & -i);
for (int i = 1; i <= q; ++i) {
if (init[i].max == -1E9) init[i].max = b[i].r;
else init[i] = {};
init[i].pos = i;
}
seg2.init(q, init);
// for (int i = 1; i <= q; ++i) {
// std::cerr << b[i].l << " " << b[i].r << " " << b[i].idx << "\n";
// }
for (int mex = n; mex >= 0; --mex) {
// std::cerr << "mex : " << mex << "\n";
while (seg1.query(1, q).max > 0) {
int pos = seg1.query(1, q).pos;
seg1.change(pos, (Info){(int)-1E9, pos});
// std::cerr << "pos : " << pos << "!\n";
auto it = pr.lower_bound({b[pos].r, pos});
int tR = (it == pr.begin() ? 0 : (*std::prev(it))[0]);
int nR = (std::next(it) == pr.end() ? n + 1 : (*std::next(it))[1]);
// std::cerr << "tR : " << tR << " , nR : " << nR << "\n";
ans[b[pos].idx] = mex + 1;
pr.erase(it);
pl.erase(pl.lower_bound({b[pos].l, pos}));
while (true) {
int np = seg2.query(pos + 1, nR - 1).pos;
if (b[np].r > tR) {
pl.insert({b[np].l, np});
pr.insert({b[np].r, np});
seg2.change(np, (Info){(int)-1E9, np});
seg1.change(np, (Info){fen.query(b[np].r) - fen.query(b[np].l - 1) - mex, np});
nR = np;
} else break;
}
}
seg1.modify(1, q, (Tag){1});
for (auto i : vec[mex]) {
fen.add(i, -1);
auto itr = pr.lower_bound({i, 0});
if (itr == pr.end()) continue;
auto itl = pl.upper_bound({i, (int)1E9});
if (itl == pl.begin()) continue;
int r = (*std::prev(itl))[1], l = (*itr)[1];
// std::cerr << "l : " << l << " , r : " << r << "\n";
seg1.modify(l, r, (Tag){-1});
}
}
for (int i = 1; i <= q; ++i) {
std::cout << ans[i] << "\n";
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 11832kb
input:
3 3 0 0 2 1 3 2 3 3 3
output:
3 1 0
result:
ok 3 number(s): "3 1 0"
Test #2:
score: 0
Accepted
time: 2ms
memory: 12024kb
input:
3 2 1 2 2 1 2 1 3
output:
0 3
result:
ok 2 number(s): "0 3"
Test #3:
score: 0
Accepted
time: 2ms
memory: 12028kb
input:
10 10 3 0 3 3 9 7 9 6 0 7 3 3 9 9 4 6 1 9 3 4 2 4 7 10 3 7 5 7 2 7
output:
0 1 0 5 0 1 1 0 0 1
result:
ok 10 numbers
Test #4:
score: 0
Accepted
time: 2ms
memory: 11880kb
input:
10 10 3 0 0 0 5 1 1 1 2 1 1 2 8 8 5 7 1 7 2 2 1 5 5 6 4 6 3 10 6 8
output:
1 0 2 7 1 4 0 2 8 3
result:
ok 10 numbers
Test #5:
score: 0
Accepted
time: 0ms
memory: 12068kb
input:
100 100 15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90 1...
output:
68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 0 0 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 100 numbers
Test #6:
score: 0
Accepted
time: 2ms
memory: 11744kb
input:
100 100 17 86 33 8 11 27 8 11 13 9 3 43 11 23 26 42 44 12 44 12 15 0 75 51 72 5 49 2 40 57 24 47 39 42 4 5 6 52 3 2 42 19 62 33 24 22 16 69 4 33 44 70 29 11 2 2 58 9 6 10 25 10 33 26 17 3 14 0 48 7 48 51 0 39 54 37 14 9 3 85 18 4 25 9 2 0 39 8 17 13 25 45 10 39 12 18 9 5 66 6 13 89 10 90 42 67 43 52...
output:
76 80 0 0 18 1 18 1 5 5 1 1 22 11 0 15 0 59 5 56 1 80 0 1 1 21 0 61 22 11 0 3 8 15 40 1 8 81 71 20 2 0 60 0 60 31 0 59 0 0 0 28 0 21 1 7 5 0 31 0 76 28 0 0 27 1 23 0 1 27 1 0 0 1 0 5 63 52 2 43 73 1 86 0 61 0 27 2 30 5 31 1 0 14 59 27 1 1 67 63
result:
ok 100 numbers
Test #7:
score: 0
Accepted
time: 2ms
memory: 11876kb
input:
100 100 6 1 1 5 13 11 35 5 3 2 0 4 0 9 1 2 3 3 19 1 7 9 7 11 7 8 10 18 28 17 31 2 4 8 2 3 3 2 22 4 9 4 7 2 9 15 8 2 3 19 5 24 3 10 11 5 9 20 8 4 11 10 18 9 13 34 5 34 2 9 24 6 21 16 6 12 26 2 2 2 6 11 2 14 3 8 2 12 2 19 8 3 18 23 5 21 23 8 4 0 44 67 25 74 24 79 59 73 4 81 42 66 48 55 15 38 35 63 16 ...
output:
22 50 56 0 78 23 0 22 29 24 38 37 17 57 0 6 0 58 52 4 64 44 0 37 75 75 34 89 0 4 0 12 39 0 0 69 53 14 38 13 36 30 0 7 46 83 28 6 44 22 40 50 24 26 36 49 0 0 6 49 27 78 0 37 11 49 16 50 25 30 37 58 64 28 62 36 0 52 0 95 34 4 50 17 0 27 44 0 0 21 44 66 69 0 39 25 0 2 63 0
result:
ok 100 numbers
Test #8:
score: -100
Wrong Answer
time: 2ms
memory: 12000kb
input:
100 100 0 1 0 1 0 1 1 1 0 2 1 1 2 0 1 1 0 3 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 1 0 0 1 2 0 0 1 0 0 3 0 1 0 0 3 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 0 4 0 1 1 0 1 0 2 2 0 0 1 41 53 31 36 78 99 60 86 1 67 3 92 89 92 60 70 42 56 42 46 39 84 40 66 9 27 75 78 33 94 17 53...
output:
13 6 22 27 67 90 2 11 15 5 46 27 19 4 62 37 84 35 53 4 47 95 55 63 24 39 22 51 67 21 55 36 24 16 33 74 4 16 63 81 41 14 3 54 6 40 36 33 29 32 14 60 13 17 73 44 34 2 14 79 59 13 75 72 31 10 22 57 23 37 74 2 6 6 38 5 4 62 66 22 33 0 23 21 12 54 75 6 8 16 37 36 3 53 63 18 67 60 31 19
result:
wrong answer 7th numbers differ - expected: '3', found: '2'