莫队 WAon3 90pts 求助(开O2)((((
查看原帖
莫队 WAon3 90pts 求助(开O2)((((
289436
LZX_ssfd楼主2022/8/6 11:41
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int a[N],ans[N], belong[N],cnt[N];
struct node {
	int l, r, time, w;
	int k;
} q[N];
struct changed {
	int pos, color, last;
} c[N];
int cntq, cntc, n, m, block;
vector<int >v;
int cmp(node a, node b) {
return (a.l/block)==(b.l/block)?(a.r/block)==(b.r/block)?a.time<b.time:a.r<b.r:a.l<b.l;
}
signed main() {
	scanf("%lld%lld",&n,&m);
	block=pow(n,2.0/3.0);
	for(int i=1; i<=n; ++i)
		scanf("%lld",&a[i]),v.push_back(a[i]);
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(), v.end()),v.end());
	for(int i=1; i<=n; i++)
		a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
	for(int i=1; i<=m; ++i) {
		char opt;
		int l,r,k;
		cin>>opt;
		scanf("%lld%lld",&l,&r);
		if(opt=='Q') {
			cin>>k;
			k=lower_bound(v.begin(),v.end(),k)-v.begin()+1;
			q[++cntq].l=l;
			q[cntq].r=r;
			q[cntq].k=k;
			q[cntq].time=cntc;
			q[cntq].w= cntq;
		} else {
			r=lower_bound(v.begin(),v.end(),r)-v.begin()+1;
			c[++cntc].pos=l;
			c[cntc].color=r;
		}
	}
	sort(q+1,q+cntq+1,cmp);
	int l=1,r=0,time=0;
	for(int i=1; i<=cntq; ++i) {
		int ql=q[i].l,qr=q[i].r,qt=q[i].time;
		while(l<ql)--cnt[a[l++]];
		while(l>ql)cnt[a[--l]]++;
		while(r<qr)cnt[a[++r]]++;
		while(r>qr)--cnt[a[r--]];
		while(time<qt) {
			++time;
			if(ql<=c[time].pos&&c[time].pos<=qr)--cnt[a[c[time].pos]],cnt[c[time].color]++;
			swap(a[c[time].pos],c[time].color);
		}
		while(time>qt) {
			if(ql<=c[time].pos&&c[time].pos<=qr)--cnt[a[c[time].pos]],cnt[c[time].color]++;
			swap(a[c[time].pos],c[time].color);
			--time;
		}
		ans[q[i].w]=cnt[q[i].k];
	}
	for(int i=1; i<=cntq; ++i)
		printf("%lld\n",ans[i]);
	return 0;
}
2022/8/6 11:41
加载中...