分块30pts求助
查看原帖
分块30pts求助
302394
dingshengyang楼主2022/1/28 16:00
#include <bits/stdc++.h>
#define R register
#define inl inline
#define fastios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define Debug(file) freopen(file".in","r",stdin);freopen(file".out","w",stdout);
using namespace std;
const int N = 3e5 + 5;
const int block = 1062;
int colour[N/block+5][N];
int a[N];
int n,m;

int main() {
    fastios;
	cin >> n >> m;
	for(R int i = 1;i <= n;i ++){
		cin >> a[i];
		colour[(i+block-1)/block][a[i]] ++;
	}
	while(m--){
		int l,r,op,x;
		cin >> op;
		if(op == 1){
			cin >> l >> r >> x;
			int lb,rb = -block,ans = 0;
			for(R int i = N/block;i >= 1;i --){
				if(i*block>=l&&l>(i-1)*block){
					lb = i*block;
				}
			}
			for(R int i = 1;i <= N/block;i ++){
				if(i*block<=r&&(i+1)*block>r){
					rb = i*block;
				}
			}
			for(R int i = lb/block;i <= rb/block;i ++)ans+=colour[i][x];
			for(R int i = l;(i < rb||rb<0) && i <= r;i ++)ans += (a[i]==x);
			if(rb>0)for(R int i = rb + 1;i <= r ;i ++)ans += (a[i]==x);
			cout << ans << endl;
		}else{
			cin >> x;
			if((x+block-1)/block == (x+block)/block){
				swap(a[x],a[x+1]);
			}else{
				int ltype = a[x];
				int rtype = a[x+1];
				swap(a[x],a[x+1]);
				int lpart = (x+block-1)/block;
				int rpart = (x+block)/block;
				if(ltype != rtype){
					colour[lpart][ltype] --;
					colour[rpart][rtype] --;
					colour[lpart][rtype] ++;
					colour[rpart][ltype] ++;
				}
			}
		}
	}
	return 0;
}

2022/1/28 16:00
加载中...