제출 #1295413

#제출 시각아이디문제언어결과실행 시간메모리
1295413am_aadvikBubble Sort Machine (JOI25_bubble)C++20
100 / 100
1640 ms70900 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#define int long long
const int maxn = 500005;
const int inf = 1e17;
using namespace std;

//W segtree
struct segtree {
	int t[2 * maxn], n;
	void build() {
		for (int i = n - 1; i > 0; --i)
			t[i] = t[i << 1] + t[i << 1 | 1];
	}
	void update(int p, int value) {
		for (t[p += n] = value; p > 1; p >>= 1)
			t[p >> 1] = t[p] + t[p ^ 1];
	}
	int query(int l, int r) {
		int res = 0;
		for (l += n, r += (n + 1); l < r; l >>= 1, r >>= 1) {
			if (l & 1) res += t[l++];
			if (r & 1) res += t[--r];
		}
		return res;
	}
	void init(int N, vector<int> a) {
		for (int i = 0; i < N; ++i)
			t[i + N] = a[i];
		n = N, build();
	}
};
/////////////////////////////////////////////////////////////////
vector<int> a, res, idx;
vector<pair<int, int>> arr;
vector<pair<int, pair<int, int>>> qs;
segtree s1, s2;
int32_t main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n; cin >> n;
	a.resize(n), idx.resize(n), arr.resize(n);
	for (auto& x : a) cin >> x;
	for (int i = 0; i < n; ++i)
		arr[i] = { a[i], i };
	sort(arr.begin(), arr.end());
	for (int i = 0; i < n; ++i)
		idx[arr[i].second] = i;
	s1.init(n, vector<int>(n, 0));
	s2.init(n, vector<int>(n, 0));
	int q, k = 0; cin >> q;
	while (q--) {
		int t; cin >> t;
		if (t == 1) ++k;
		else {
			int l, r; cin >> l >> r; l -= 2, --r;
			if (l >= 0) qs.push_back({ l + k + 1, {l + 1, -(int)res.size() - 1} });
			qs.push_back({ r + k + 1, {r + 1, res.size() + 1 } });
			res.push_back(0);
		}
	}
	sort(qs.begin(), qs.end());
	int j = 0;
	for (int i = 0; i < qs.size(); ++i) {
		while ((j < n) && (j < qs[i].first))
			s1.update(idx[j], a[j]), s2.update(idx[j], 1), ++j;
		int s = 0, e = n - 1, ksm = n - 1;
		while (s <= e) {
			int m = (s + e) / 2;
			if (s2.query(0, m) >= qs[i].second.first)
				ksm = m, e = m - 1;
			else s = m + 1;
		}
		int ans = s1.query(0, ksm);
		int l = qs[i].second.second;
		res[abs(l) - 1] += (l / abs(l)) * ans;
	}
	for (auto x : res) cout << x << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...