|
| 1 | +#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_A" // DUMMY |
| 2 | + |
| 3 | +#include "../../random/xorshift.hpp" |
| 4 | +#include "../acl_beats.hpp" |
| 5 | + |
| 6 | +#include <algorithm> |
| 7 | +#include <cstdio> |
| 8 | +#include <numeric> |
| 9 | +#include <vector> |
| 10 | + |
| 11 | +using RangeChMinMaxAddSum::S, RangeChMinMaxAddSum::F; |
| 12 | + |
| 13 | +int main() { |
| 14 | + for (int trial = 0; trial < 1 << 20; ++trial) { |
| 15 | + const int N = rand_int() % 32 + 1; |
| 16 | + |
| 17 | + const int maxA = rand_int() % 50 + 1; |
| 18 | + const int Q = rand_int() % 10 + 1; |
| 19 | + |
| 20 | + std::vector<S> A(N); |
| 21 | + std::vector<int> simulate(N); |
| 22 | + for (int i = 0; i < N; ++i) { |
| 23 | + simulate.at(i) = rand_int() % (maxA + 1); |
| 24 | + A.at(i) = S(simulate.at(i), 1); |
| 25 | + } |
| 26 | + |
| 27 | + segtree_beats<S, RangeChMinMaxAddSum::op, RangeChMinMaxAddSum::e, F, RangeChMinMaxAddSum::mapping, |
| 28 | + RangeChMinMaxAddSum::composition, RangeChMinMaxAddSum::id> |
| 29 | + segtree(A); |
| 30 | + |
| 31 | + for (int q = 0; q < Q; ++q) { |
| 32 | + int tp = rand_int() % 4; |
| 33 | + if (q == Q - 1) tp = 3; |
| 34 | + |
| 35 | + int l = 0, r = 0; |
| 36 | + while (l == r) { |
| 37 | + l = rand_int() % (N + 1); |
| 38 | + r = rand_int() % (N + 1); |
| 39 | + if (l > r) std::swap(l, r); |
| 40 | + } |
| 41 | + |
| 42 | + if (tp < 3) { |
| 43 | + int b = rand_int() % (maxA + 1); |
| 44 | + if (tp == 0) { |
| 45 | + for (int i = l; i < r; ++i) simulate.at(i) = std::min(simulate.at(i), b); |
| 46 | + segtree.apply(l, r, RangeChMinMaxAddSum::F::chmin(b)); |
| 47 | + } |
| 48 | + |
| 49 | + if (tp == 1) { |
| 50 | + for (int i = l; i < r; ++i) simulate.at(i) = std::max(simulate.at(i), b); |
| 51 | + segtree.apply(l, r, RangeChMinMaxAddSum::F::chmax(b)); |
| 52 | + } |
| 53 | + |
| 54 | + if (tp == 2) { |
| 55 | + for (int i = l; i < r; ++i) simulate.at(i) += b; |
| 56 | + segtree.apply(l, r, RangeChMinMaxAddSum::F::add(b)); |
| 57 | + } |
| 58 | + } |
| 59 | + |
| 60 | + if (tp == 3) { |
| 61 | + auto prod = segtree.prod(l, r); |
| 62 | + |
| 63 | + std::vector<int> values; |
| 64 | + for (int i = l; i < r; ++i) values.push_back(simulate.at(i)); |
| 65 | + std::sort(values.begin(), values.end()); |
| 66 | + |
| 67 | + assert(prod.lo == values.front()); |
| 68 | + assert(prod.nlo == std::count(values.begin(), values.end(), prod.lo)); |
| 69 | + |
| 70 | + assert(prod.hi == values.back()); |
| 71 | + assert(prod.nhi == std::count(values.begin(), values.end(), prod.hi)); |
| 72 | + |
| 73 | + assert(prod.sum == std::accumulate(values.begin(), values.end(), 0LL)); |
| 74 | + |
| 75 | + assert(prod.sz == r - l); |
| 76 | + assert(!prod.fail); |
| 77 | + |
| 78 | + if (values.front() != values.back()) { |
| 79 | + int i = 0; |
| 80 | + while (values.at(i) == values.front()) ++i; |
| 81 | + assert(prod.lo2 == values.at(i)); |
| 82 | + |
| 83 | + i = (int)values.size() - 1; |
| 84 | + while (values.at(i) == values.back()) --i; |
| 85 | + assert(prod.hi2 == values.at(i)); |
| 86 | + } |
| 87 | + } |
| 88 | + } |
| 89 | + } |
| 90 | + |
| 91 | + puts("Hello World"); |
| 92 | +} |
0 commit comments