树套树0pts求助
查看原帖
树套树0pts求助
1046406
Unpt_V3楼主2025/1/23 10:52

阳历已过

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5+75;

int n , m , a[N] , lsh[N*6] , lt(0);

struct Query__ {
	char op;
	int ls , rs , kp;
}p[N*2];

int node(0) , root[N*3];	

struct Tree_Node {
	int l , r , pre;
}t[N*60];

int Lb (int x)
{
	return x & (-x);
}

int New (int x = 0)
{
	++ node;
	t[node] = t[x];
	return node;
}

int Update (int x , int l , int r , int k , int val)
{
	if(!x) x = New ();
	t[x].pre += val;
	if(l == r) return x;
	int mid = (l+r)/2;
	if(k <= mid) t[x].l = Update (t[x].l , l , mid , k , val);
	if(mid+1 <= k) t[x].r = Update (t[x].r , mid+1 , r , k , val);
	return x;
}

void Modify (int tp , int val)
{
	int pos = lower_bound (lsh+1 , lsh+1+lt , a[tp]) - lsh;
	for(int i = tp ; i <= lt ; i += Lb (i))
	{
		root[i] = Update (root[i] , 1 , lt , pos , val);
	}
	return;
}

int Query (int x , int l , int r , int k)
{
	if(l == r) return t[x].pre;
	int mid = (l+r)/2;
	if(k <= mid) return Query (t[x].l , l , mid , k);
	else return Query (t[x].r , mid+1 , r , k);
}

int Ask (int rx , int lx , int k)
{
	int ans (0);
	k = lower_bound (lsh+1 , lsh+1+lt , k) - lsh;
	for(int i = lx-1 ; i ; i -= Lb (i))
	{
		ans -= Query (root[i] , 1 , lt , k);
	}
	for(int i = rx ; i ; i -= Lb (i))
	{
		ans += Query (root[i] , 1 , lt , k);
	}
	return ans;
}

int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1 ; i <= n ; i ++)
	{
		scanf("%d",&a[i]);
		lsh[++ lt] = a[i];
	}
	for(int i = 1 ; i <= m ; i ++)
	{
		cin >> p[i].op;
		if(p[i].op == 'C')
		{
			scanf("%d%d",&p[i].ls,&p[i].kp);
			p[i].rs = p[i].ls;
			lsh[++ lt] = p[i].kp;
		}
		else 
		{
			scanf("%d%d%d",&p[i].ls,&p[i].rs,&p[i].kp);
			lsh[++ lt] = p[i].kp;
		}
	}
	sort (lsh+1 , lsh+1+lt);
	lt = unique (lsh+1 , lsh+1+lt) - lsh - 1;
	
	for(int i = 1 ; i <= n ; i ++)
	{
		Modify (i , 1);
	}
	
	for(int i = 1 ; i <= m ; i ++)
	{
		const Query__ &now = p[i];
		if(now.op == 'C')
		{
			Modify (p[i].ls , -1);
			a[p[i].ls] = p[i].kp;
			Modify (p[i].ls , 1);
		}
		if(now.op == 'Q')
		{
			printf("%d\n",Ask(p[i].rs,p[i].ls,p[i].kp));
		}
	}
	
	return 0;
}
2025/1/23 10:52
加载中...