95分求助,第二个过不去
查看原帖
95分求助,第二个过不去
667180
Assassin_HG楼主2024/1/23 09:28
#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5+10;
int sum[maxn<<6],ls[maxn<<6],rs[maxn<<6];
int cnt,rt[maxn],a[maxn],num;
void Modify(int &rt,int q,int l,int r,int val,int num) {
	rt = ++cnt;
	sum[rt] = sum[q]+num;
	ls[rt] = ls[q];
	rs[rt] = rs[q];
	if(l==r) {
		return;
	}
	int mid = (l+r)>>1;
	if(val<=mid) {
		Modify(ls[rt],ls[q],l,mid,val,num);
	} else {
		Modify(rs[rt],rs[q],mid+1,r,val,num);
	}
}
int Ask(int rt,int q,int l,int r,int val) {
	if(l==r) {
		return sum[q]-sum[rt];
	}
	int mid = (l+r)>>1;
	if(val<=mid) {
		return Ask(ls[rt],ls[q],l,mid,val);
	} else {
		return Ask(rs[rt],rs[q],mid+1,r,val);
	}
}
int main() {
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; ++i) {
		scanf("%d",&a[i]);
	}
	for(int i =1; i<=n; ++i) {
		Modify(rt[i],rt[i-1],1,n,a[i],1);
	}
	while(m--) {
		int op,l,r,pos;
		scanf("%d",&op);
		if(op==1) {
			scanf("%d%d%d",&l,&r,&pos);
			printf("%d\n",Ask(rt[l-1],rt[r],1,n,pos));
		} else {
			scanf("%d",&pos);
			Modify(rt[pos],rt[pos],1,n,a[pos],-1);
			Modify(rt[pos],rt[pos],1,n,a[pos+1],1);
			swap(a[pos],a[pos+1]);
		}
	}
	return 0;
}
2024/1/23 09:28
加载中...