带修主席树70pts求调
查看原帖
带修主席树70pts求调
677939
westernhan楼主2024/7/23 18:55

卡了好久了呜呜呜

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N=1e5;
int n,m,a[N+5],lisan[N*2+5],tot;
char opt[3];
struct quire
{
	int l,r,rnk,pos,val,op;
}q[N+5];
struct ChairmanTree
{
	struct tree
	{
		int ls,rs,val;
	}t[400*N+5];
	int rt[N+5],siz,tmp[2][N+5];
	void modify(int &u,int l,int r,int id,int v)
	{
		if (!u) u=++siz;
		t[u].val+=v;
		if (l==r) return;
		int mid=(l+r)>>1;
		if (id<=mid) modify(t[u].ls,l,mid,id,v);
		else modify(t[u].rs,mid+1,r,id,v);
	}
	void add(int u,int v)
	{
		int id=lower_bound(lisan+1,lisan+tot+1,a[u])-lisan;
		for (int i=u;i<=n;i+=lowbit(i)) modify(rt[i],1,tot,id,v);
	}
	int getsum(int u,int l,int r)
	{
		int res=0;
		int tx=0,ty=0;
		for (int i=r;i;i-=lowbit(i)) tmp[1][++ty]=rt[i];
		for (int i=l-1;i;i-=lowbit(i)) tmp[0][++tx]=rt[i];
		int pl=1,pr=tot;
		while (1)
		{
			if (pl==pr) break;
			int mid=(pl+pr)>>1;
			if (u<=mid)
			{
				for (int i=1;i<=ty;i++) tmp[1][i]=t[tmp[1][i]].ls;
				for (int i=1;i<=tx;i++) tmp[0][i]=t[tmp[0][i]].ls;
				pr=mid;
			}
			else
			{
				for (int i=1;i<=ty;i++) tmp[1][i]=t[tmp[1][i]].rs;
				for (int i=1;i<=tx;i++) tmp[0][i]=t[tmp[0][i]].rs;
				pl=mid+1;
			}
		}
		for (int i=1;i<=ty;i++) res+=t[tmp[1][i]].val;
		for (int i=1;i<=tx;i++) res-=t[tmp[0][i]].val;
		return res;
	}
}T;
int main(void)
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%d",a+i),lisan[++tot]=a[i];
	for (int i=1;i<=m;i++)
	{
		scanf("%s",opt+1);q[i].op=(opt[1]=='Q');
		if (q[i].op) scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].rnk),lisan[++tot]=q[i].rnk;
		else scanf("%d%d",&q[i].pos,&q[i].val),lisan[++tot]=q[i].val;
	}
	sort(lisan+1,lisan+tot+1);
	tot=unique(lisan+1,lisan+tot+1)-lisan-1;
	for (int i=1;i<=n;i++) T.add(i,1);
	for (int i=1;i<=m;i++)
	{
		if (q[i].op) printf("%d\n",T.getsum(q[i].rnk,q[i].l,q[i].r));
		else
		{
			T.add(q[i].pos,-1);
			a[q[i].pos]=q[i].val;
			T.add(q[i].pos,1);
		}
	}
	return 0;
}

2024/7/23 18:55
加载中...