求条带修莫队,样例没过,玄关
查看原帖
求条带修莫队,样例没过,玄关
1251532
apiad楼主2024/3/6 21:18
// Author: gsczl71
// Copyright (c) 2024 gsczl71 All rights reserved.

#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define endl '\n'
#define debug puts("AK IOI")
#define re register
#define pb push_back
#define mem(a,x) memset((a),(x),sizeof(a))
#define vi vector<int>
#define pq priority_queue
using namespace std;
#define int long long
const int mod = 1e9+7;
//const int mod = 998244353;
const int inf = 0x3f3f3f3f,N = 133333+5,M = 1e6+5,K = 3000+5;
const long long linf = 0x3f3f3f3f3f3f3f3f;
int n,m;
int len ;//块长
int a[N];
struct query{
	int id,delid,l,r;
}q[N];
struct del{
	int id,x;
}d[N];
int qn,dn;
int id[N];
bool cmp(query a,query b){
	if(id[a.l] != id[b.l]) return id[a.l] < id[b.l];//左端点排序
	if(id[a.r] != id[b.r]) return id[a.r] < id[b.r];//右端点排序
	return a.delid < b.delid;//按照时间戳排序
}int cnt[N],now;
int ans[N];
void add(int x){if(!(cnt[x]++)) now++;}
void dl(int x){if(!(--cnt[x])) now--;}
void md(){
	for(int i = 1;i <= n;i++) id[i] = (i-1)/len + 1;
	sort(q+1,q+1+qn,cmp);
	int l=1,r=0,tim=0;
	for(int i = 1;i <= n;i++){
		while(r>q[i].r) dl(a[r--]);
		while(r<q[i].r) add(a[++r]);
		while(l>q[i].l) add(a[--l]);
		while(l<q[i].l) add(a[l++]);
		while(tim<q[i].delid){
			tim++;
			if(d[tim].id >= l && d[tim].id <= r){
				add(d[tim].x);
				dl(a[d[tim].id]);
			}swap(a[d[tim].id],d[tim].x);//取反,以后还要改直接改就行
		}
		while(tim>q[i].delid){
			if(d[tim].id >= l && d[tim].id <= r){
				add(d[tim].x);
				dl(a[d[tim].id]);
			}swap(a[d[tim].id],d[tim].x);//取反,以后还要改直接改就行
			tim--;
		}
		ans[q[i].id] = now;
	}
}
void solve(){
	cin>>n>>m;
	len = pow(n,2.0/3.0);
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++){
		char c;
		int x,y;
		cin >> c >> x >> y;
		if(c=='Q'){
			q[++qn]={qn,dn,x,y};
		}else{
			d[++dn]={x,y};
		}
	}
	md();
	for(int i = 1;i <= qn;i++){
		cout<<ans[i]<<endl;
	}
}
signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T=1;
//	cin >> T;
	while(T--) solve();
	return 0;
}
2024/3/6 21:18
加载中...