分块40分
查看原帖
分块40分
701221
Chr0n1CleC楼主2022/9/6 14:02
#include<stdio.h>
#include<math.h>
#define N 300009
#include<map>

std::map < int, int > cnt[1509];

static int a[N], whe[N];

static int st[N], en[N];

inline void swap(register int& a, register int& b) {a ^= b, b ^= a, a ^= b;}

inline int query(register int l, register int r, register int c)
{
	register int L = whe[l], R = whe[r], ret = 0;
	if (L == R)
		for (register int i = l;i <= r;++ i)
			(a[i] == c) ? ++ ret : 0;
	else
	{
		for (register int i = l;i <= en[L];++ i)
			(a[i] == c) ? ++ ret : 0;
		for (register int i = st[R];i <= r;++ i)
			(a[i] == c) ? ++ ret : 0;
		for (register int i = L + 1;i < R;++ i)
			ret += cnt[i][c]; 
	}
	return ret;
}

inline int read()
{
	register int ret = 0;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		ch = getchar();
	while (ch >= '0' && ch <= '9')
		ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
	return ret;
}

inline void write(register int x)
{
	static int s[7];
	register int top = 0;
	while (x)
		s[++ top] = x % 10, x /= 10;
	while (top)
		putchar('0' + s[top --]);
}

int main()
{
	register int n = read(), m = read();
	for (register int i = 1;i <= n;++ i)
		a[i] = read();
	register int block = sqrt(n);
	if (n % block)
		++ block;
	for (register int i = 1;i <= block;++ i)
		st[i] = en[i - 1] + 1, en[i] = st[i] + block - 1;
	en[block] = n;
	for (register int i = 1;i <= block;++ i)
		for (register int j = st[i];j <= en[i];++ j)
			whe[j] = i, cnt[i][a[j]] ++;
	register int opt, l, r, c;
	while (m --)
	{
		opt = read(), l = read();
		if (opt == 2)
			-- cnt[whe[l]][a[l]], -- cnt[whe[l + 1]][a[l + 1]],
			swap(a[l], a[l + 1]),
			++ cnt[whe[l]][a[l]], ++ cnt[whe[l + 1]][a[l + 1]];
		else
		{
			r = read(), c = read();
			//write(query(l, r, c)), putchar('\n');
			printf("%d\n", query(l, r, c));
		}
	}
	
	return 0;
}
2022/9/6 14:02
加载中...