只对了后面三个点求调
查看原帖
只对了后面三个点求调
738474
Erine楼主2023/10/15 22:20
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int maxn = 1e6 + 10;

struct modify {
	int p, c;
	modify() = default;
	modify(int p, int c): p(p), c(c) {}
};

struct query {
	int l, r, t, id;
	query() = default;
	query(int l, int r, int t, int id): l(l), r(r), t(t), id(id) {}
};

int n, c, m, t, s, l = 1, r, k, cur;
int a[maxn], b[maxn];
query q[maxn];
modify f[maxn][2];
int ans[maxn];
int cnt[maxn];

void add(int p) {
	if (!cnt[a[p]]) ++cur;
	cnt[a[p]]++;
}

void rem(int p) {
	cnt[a[p]]--;
	if (!cnt[a[p]]) --cur;
}

void mdf(int p, int id) {
	if (l <= f[p][id].p && f[p][id].p <= r) {
		add(f[p][id].c);
		rem(a[f[p][id].p]);
	}
	a[f[p][id].p] = f[p][id].c;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> c;
	for (int i = 1; i <= n; i++) cin >> a[i], b[i] = a[i];
	for (int i = 1; i <= c; i++) {
		char op;
		int x, y;
		cin >> op >> x >> y;
		if (op == 'Q') ++m, q[m] = query(x, y, t, m);
		else ++t, f[t][0] = modify(x, y), f[t][1] = modify(x, b[x]), b[x] = y;
	}
	s = max(1., pow(n, 2.0 / 3));
	sort(q + 1, q + 1 + m, [=] (query x, query y) {
		if (x.l / s != y.l / s) return x.l / s < y.l / s;
		if (x.r / s != y.r / s) return x.r / s < y.r / s;
		return x.t < y.t;
	});
	for (int i = 1; i <= m; i++) {
		while (r < q[i].r) add(++r);
		while (q[i].l < l) add(--l);
		while (q[i].r < r) rem(r--);
		while (l < q[i].l) rem(l++);
		while (k < q[i].t) mdf(++k, 0);
		while (q[i].t < k) mdf(k--, 1);
		ans[q[i].id] = cur;
	}
	for (int i = 1; i <= m; i++) cout << ans[i] << endl;
	return 0;
}
2023/10/15 22:20
加载中...