// #define _GLIBCXX_DEBUG #include // clang-format off std::ostream&operator<<(std::ostream&os,std::int8_t x){return os<<(int)x;} std::ostream&operator<<(std::ostream&os,std::uint8_t x){return os<<(int)x;} std::ostream&operator<<(std::ostream&os,const __int128_t &v){if(!v)os<<"0";__int128_t tmp=v<0?(os<<"-",-v):v;std::string s;while(tmp)s+='0'+(tmp%10),tmp/=10;return std::reverse(s.begin(),s.end()),os<std::ostream &operator<<(std::ostream&os,const std::pair&x){return os<<"("<std::ostream &operator<<(std::ostream&os,const std::vector&vec){os<<'[';for(int _=0,__= vec.size();_<__;++_)os<<(_ ?", ":"")<std::ostream &operator<<(std::ostream&os,const std::set&s){os<<'{';int _=0;for(const auto &x:s)os<<(_++ ? ", " : "")<std::ostream&operator<<(std::ostream &os,const std::array &arr) {os<<'['<void print(std::ostream&os,const Tup &x,std::index_sequence){(void)(int[]){(os<(x)<<", ",0)...};} templatestd::ostream &operator<<(std::ostream&os,const std::tuple &x) {static constexpr std::size_t N = sizeof...(Args);os<<"(";if constexpr(N>=2)print(os,x,std::make_index_sequence());return os<(x)<<")";} const std::string COLOR_RESET="\033[0m",BRIGHT_GREEN="\033[1;32m",BRIGHT_RED="\033[1;31m",BRIGHT_CYAN="\033[1;36m",NORMAL_CROSSED="\033[0;9;37m",ITALIC="\033[3m",BOLD="\033[1m",RED_BACKGROUND="\033[1;41m",NORMAL_FAINT="\033[0;2m"; #define func_LINE_FILE NORMAL_FAINT<<" in "<"< struct SegmentTree_Beats { using T= typename M::T; using E= typename M::E; SegmentTree_Beats() {} SegmentTree_Beats(int n_): n(n_), height(n == 1 ? 0 : std::__lg(n - 1) + 1), dat(n * 2, M::ti()), laz(n, {E(), false}) {} SegmentTree_Beats(int n_, T v1): SegmentTree_Beats(n_) { for (int i= n; i--;) dat[i + n]= v1; for (int i= n; --i;) update(i); } SegmentTree_Beats(const std::vector &v): SegmentTree_Beats(v.size()) { for (int i= n; i--;) dat[i + n]= v[i]; for (int i= n; --i;) update(i); } void unsafe_set(int k, T x) { dat[k + n]= x; } void rebuild() { for (int i= n; i--;) laz[i].flg= false; for (int i= n; --i;) update(i); } void apply(int a, int b, E x) { a+= n, b+= n; for (int i= height; i; i--) if (((a >> i) << i) != a) eval(a >> i); for (int i= height; i; i--) if (((b >> i) << i) != b) eval((b - 1) >> i); for (int l= a, r= b; l < r; l>>= 1, r>>= 1) { if (l & 1) propagate(l++, x); if (r & 1) propagate(--r, x); } for (int i= 1; a >> i; i++) if (((a >> i) << i) != a) update(a >> i); for (int i= 1; b >> i; i++) if (((b >> i) << i) != b) update((b - 1) >> i); } void set(int k, T x) { int i= height; for (k+= n; i; i--) eval(k >> i); for (dat[k]= x, i= 1; k >> i; i++) update(k >> i); } T fold(int a, int b) { //[a,b) a+= n, b+= n; for (int i= height; i; i--) if (((a >> i) << i) != a) eval(a >> i); for (int i= height; i; i--) if (((b >> i) << i) != b) eval(b >> i); T vl= M::ti(), vr= M::ti(); for (int l= a, r= b; l < r; l>>= 1, r>>= 1) { if (l & 1) vl= M::op(vl, dat[l++]); if (r & 1) vr= M::op(dat[--r], vr); } return M::op(vl, vr); } T fold_all() const { return dat[1]; } T operator[](const int k) { return fold(k, k + 1); } private: const int n, height; struct Lazy { E val; bool flg; }; std::vector dat; std::vector laz; inline void eval(int k) { if (!laz[k].flg) return; propagate(k << 1 | 0, laz[k].val), propagate(k << 1 | 1, laz[k].val); laz[k].flg= false; } inline void propagate(int k, const E &x) { if (bool success= M::mapping(dat[k], x); k < n) { laz[k].flg ? (M::composition(laz[k].val, x), x) : laz[k].val= x; if (laz[k].flg= true; !success) eval(k), update(k); } } inline void update(int k) { dat[k]= M::op(dat[k << 1 | 0], dat[k << 1 | 1]); } }; template auto compress(std::vector &v) { return std::sort(v.begin(), v.end()), v.erase(std::unique(v.begin(), v.end()), v.end()), [&v](T x) { return std::lower_bound(v.begin(), v.end(), x) - v.begin(); }; } template class BinaryIndexedTree { std::vector dat; public: BinaryIndexedTree(int n): dat(n + 1, T()) {} BinaryIndexedTree(int n, T a): BinaryIndexedTree(std::vector(n, a)) {} BinaryIndexedTree(const std::vector &y): dat(y.size() + 1, 0) { for (int i= y.size(); i--;) dat[i + 1]= y[i]; for (int i= 1, e= dat.size(), j; i < e; ++i) if ((j= i + (i & -i)) < e) dat[j]+= dat[i]; } void add(int i, T a= 1) { for (++i; i < (int)dat.size(); i+= i & -i) dat[i]+= a; } T sum(int i) const { // sum [0,i) T s= 0; for (; i; i&= i - 1) s+= dat[i]; return s; } T sum(int l, int r) const { return sum(r) - sum(l); } // sum [l,r) T operator[](int k) const { return sum(k + 1) - sum(k); } int find(T k) const { // min { i : sum(i+1) > k } -> kth element(0-indexed) int i= 0; for (int p= 1 << (std::__lg(dat.size() - 1) + 1), e= dat.size(); p; p>>= 1) if (i + p < e && dat[i + p] <= k) k-= dat[i+= p]; return i + 1 == (int)dat.size() ? -1 : i; // -1 -> no solutions } }; // struct Mo { // std::vector L, R; // Mo() {} // void query(int l, int r) { L.push_back(l), R.push_back(r); } /* [l, r) */ // template void run(const AL &add_left, const AR &add_right, const EL &erase_left, const ER &erase_right, const O &out) { // int q= L.size(), n= *std::max_element(R.begin(), R.end()), bs= n / std::min(n, std::sqrt(q)); // std::vector ord(q); // std::iota(ord.begin(), ord.end(), 0), std::sort(ord.begin(), ord.end(), [&](int a, int b) { // int ablk= L[a] / bs, bblk= L[b] / bs; // return ablk != bblk ? ablk < bblk : (ablk & 1) ? R[a] > R[b] : R[a] < R[b]; // }); // int l= 0, r= 0; // for (auto i: ord) { // while (l > L[i]) add_left(--l); // while (r < R[i]) add_right(r++); // while (l < L[i]) erase_left(l++); // while (r > R[i]) erase_right(--r); // out(i); // } // } // template void run(const A &add, const E &erase, const O &out) { run(add, add, erase, erase, out); } // }; struct Mo { std::vector L, R; Mo() {} void query(int l, int r) { L.push_back(l), R.push_back(r); } /* [l, r) */ template void run(const AL &add_left, const AR &add_right, const EL &erase_left, const ER &erase_right, const O &out) { int q= L.size(), n= *std::max_element(R.begin(), R.end()), bs= n / std::min(n, std::sqrt(2 * q / 3)); std::vector ord(q); std::iota(ord.begin(), ord.end(), 0), std::sort(ord.begin(), ord.end(), [&](int a, int b) { int ablk= L[a] / bs, bblk= L[b] / bs; return ablk != bblk ? ablk < bblk : (ablk & 1) ? R[a] > R[b] : R[a] < R[b]; }); int l= 0, r= 0; for (auto i: ord) { while (l > L[i]) add_left(--l); while (r < R[i]) add_right(r++); while (l < L[i]) erase_left(l++); while (r > R[i]) erase_right(--r); out(i); } } template void run(const A &add, const E &erase, const O &out) { run(add, add, erase, erase, out); } }; // struct Mo { // std::vector L, R; // Mo() {} // void query(int l, int r) { L.push_back(l), R.push_back(r); } /* [l, r) */ // template void run(const AL &add_left, const AR &add_right, const EL &erase_left, const ER &erase_right, const O &out) { // int q= L.size(), n= *std::max_element(R.begin(), R.end()), bs= n / std::min(n, std::sqrt(q)), bs2= bs / 2; // std::vector ord1(q), ord2(q); // std::iota(ord1.begin(), ord1.end(), 0), std::iota(ord2.begin(), ord2.end(), 0); // std::sort(ord1.begin(), ord1.end(), [&](int a, int b) { // int ablk= L[a] / bs, bblk= L[b] / bs; // return ablk != bblk ? ablk < bblk : (ablk & 1) ? R[a] > R[b] : R[a] < R[b]; // }); // std::sort(ord2.begin(), ord2.end(), [&](int a, int b) { // int ablk= (L[a] + bs2) / bs, bblk= (L[b] + bs2) / bs; // return ablk != bblk ? ablk < bblk : (ablk & 1) ? R[a] > R[b] : R[a] < R[b]; // }); // int l= 0, r= 0, dist1= 0, dist2= 0; // for (auto i: ord1) dist1+= std::abs(L[i] - l) + std::abs(R[i] - r), l= L[i], r= R[i]; // l= r= 0; // for (auto i: ord2) dist2+= std::abs(L[i] - l) + std::abs(R[i] - r), l= L[i], r= R[i]; // l= r= 0; // debug(dist1); // debug(dist2); // if (dist1 < dist2) // for (auto i: ord1) { // while (l > L[i]) add_left(--l); // while (r < R[i]) add_right(r++); // while (l < L[i]) erase_left(l++); // while (r > R[i]) erase_right(--r); // out(i); // } // else // for (auto i: ord2) { // while (l > L[i]) add_left(--l); // while (r < R[i]) add_right(r++); // while (l < L[i]) erase_left(l++); // while (r > R[i]) erase_right(--r); // out(i); // } // } // template void run(const A &add, const E &erase, const O &out) { run(add, add, erase, erase, out); } // }; using namespace std; namespace AOJ0425 { signed main() { cin.tie(0); ios::sync_with_stdio(0); int N, K, Q; cin >> N >> K >> Q; int a[K], b[K]; for (int k= 0; k < K; k++) cin >> a[k] >> b[k], a[k]--, b[k]--; Mo mo; int op[Q], x[Q]; for (int q= 0; q < Q; q++) { int s, t; cin >> op[q] >> s >> t >> x[q], x[q]--; mo.query(--s, t); } int ord[N], pos[N]; iota(ord, ord + N, 0), iota(pos, pos + N, 0); auto mover= [&](int k) { swap(ord[a[k]], ord[b[k]]), swap(pos[ord[a[k]]], pos[ord[b[k]]]); }; auto movel= [&](int k) { swap(pos[a[k]], pos[b[k]]), swap(ord[pos[a[k]]], ord[pos[b[k]]]); }; int ans[Q]; auto out= [&](int q) { ans[q]= (op[q] == 1 ? ord[x[q]] : pos[x[q]]) + 1; }; mo.run(movel, mover, movel, mover, out); for (int q= 0; q < Q; q++) cout << ans[q] << "\n"; return 0; } } namespace yosupo_range_inversion { signed main() { cin.tie(0); ios::sync_with_stdio(0); int N, Q; cin >> N >> Q; int A[N]; for (int i= 0; i < N; i++) cin >> A[i]; vector v(A, A + N); auto id= compress(v); for (int i= 0; i < N; i++) A[i]= id(A[i]); Mo mo; for (int q= 0; q < Q; q++) { int l, r; cin >> l >> r; mo.query(l, r); } BinaryIndexedTree bit(N + 1); long long inv= 0, total= 0; auto addl= [&](int i) { inv+= bit.sum(A[i]), bit.add(A[i], 1), total++; }; auto addr= [&](int i) { inv+= total - bit.sum(A[i] + 1), bit.add(A[i], 1), total++; }; auto erasel= [&](int i) { inv-= bit.sum(A[i]), bit.add(A[i], -1), total--; }; auto eraser= [&](int i) { inv-= total - bit.sum(A[i] + 1), bit.add(A[i], -1), total--; }; long long ans[Q]; auto out= [&](int q) { ans[q]= inv; }; mo.run(addl, addr, erasel, eraser, out); for (int q= 0; q < Q; q++) cout << ans[q] << "\n"; return 0; } } namespace yukicoder1270 { struct RmQRaQ { using T= int; using E= int; static T ti() { return 1 << 30; } static T op(T l, T r) { return min(l, r); } static bool mapping(T &v, E x) { if (v != ti()) v+= x; return true; } static void composition(E &p, E s) { p+= s; } }; signed main() { cin.tie(0); ios::sync_with_stdio(0); int N, Q; cin >> N >> Q; vector a(N); for (int i= 0; i < N; ++i) cin >> a[i], --a[i]; BinaryIndexedTree bitl(N), bitr(N); SegmentTree_Beats seg(N, 0); int sum= 0, sz= 0; for (auto x: a) { sum+= bitr.sum(x + 1, N); bitr.add(x, 1); seg.apply(x + 1, N, 1); } Mo mo; for (int q= 0; q < Q; ++q) { int l, r; cin >> l >> r; mo.query(--l, r); } auto addl= [&](int i) { int x= a[i]; sum-= bitl.sum(x + 1, N) + bitr.sum(0, x); bitl.add(x, -1); seg.apply(0, x, -1); ++sz; }; auto addr= [&](int i) { int x= a[i]; sum-= bitr.sum(0, x) + bitl.sum(x + 1, N); bitr.add(x, -1); seg.apply(x + 1, N, -1); ++sz; }; auto erasel= [&](int i) { int x= a[i]; sum+= bitl.sum(x + 1, N) + bitr.sum(0, x); bitl.add(x, 1); seg.apply(0, x, 1); --sz; }; auto eraser= [&](int i) { int x= a[i]; sum+= bitr.sum(0, x) + bitl.sum(x + 1, N); bitr.add(x, 1); seg.apply(x + 1, N, 1); --sz; }; vector ans(Q); auto out= [&](int q) { ans[q]= sum + seg.fold_all() * sz; }; mo.run(addl, addr, erasel, eraser, out); for (auto x: ans) cout << x << '\n'; return 0; } } signed main() { cin.tie(0); ios::sync_with_stdio(0); // AOJ0425::main(); // yosupo_range_inversion::main(); yukicoder1270::main(); return 0; }