悬关
查看原帖
悬关
471571
封禁用户楼主2024/3/8 17:35

全WA求调

#include<bits/stdc++.h>
#define N 100005
#define M 205
#define inf 0x3f3f3f3f
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
inline ll read()
{
	ll k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
mt19937_64 rnd(time(0));
ll n,m,Q,w[N/10+1][M];
stack<ll> stk;
string opt;
struct tree
{
	ll node,lson[N<<5],rson[N<<5],val[N<<5],tot[N<<5],siz[N<<5],key[N<<5],root[M],tmp[M];
	ll new_node(ll num)
	{
		ll p;
		if(!stk.empty()) p=stk.top(),stk.pop();
		else p=++node;
		val[p]=tot[p]=num,siz[p]=1,key[p]=rnd(),lson[p]=rson[p]=0;
		return p;
	}
	void push_up(ll p)
	{
		siz[p]=siz[lson[p]]+siz[rson[p]]+1,tot[p]=tot[lson[p]]+tot[rson[p]]+val[p];
		return;
	}
	void split(ll p,ll k,ll &x,ll &y)
	{
		if(!p)
		{
			x=y=0;
			return;
		}
		if(k<=siz[lson[p]]) y=p,split(lson[p],k,x,lson[p]);
		else x=p,split(rson[p],k-siz[lson[p]]-1,rson[p],y);
		push_up(p);
	}
	ll merge(ll x,ll y)
	{
		if(!x) return y;
		if(!y) return x;
		if(key[x]<key[y])
		{
			rson[x]=merge(rson[x],y),push_up(x);
			return x;
		}
		else
		{
			lson[y]=merge(x,lson[y]),push_up(y);
			return y;
		}
	}
	ll build(ll i,ll l,ll r)
	{
		if(l==r) return new_node(w[l][i]);
		ll mid=(l+r)>>1;
		return merge(build(i,l,mid),build(i,mid+1,r));
	}
	void insert()
	{
		ll pos=read(),k=read();
		for(ll i=1;i<=m;i++) tmp[i]=0;
		while(k--)
		{
			ll x=read()+1;
			tmp[x]=read();
		}
		for(ll i=1;i<=m;i++)
		{
			ll x,y,z;
			split(root[i],pos,x,y),z=new_node(tmp[i]);
			root[i]=merge(merge(x,z),y);
		}
	}
	void del()
	{
		ll pos=read();
		for(ll i=1;i<=m;i++)
		{
			ll x,y,z;
			split(x,pos-1,x,y),split(y,1,y,z),root[i]=merge(x,z);
			stk.push(y);
		}
	}
	void query()
	{
		ll l=read(),r=read();
		for(ll i=1;i<=m;i++)
		{
			ll x,y,z;
			split(root[i],r,x,y),split(x,l-1,x,z);
			printf("%lld ",tot[z]);
			root[i]=merge(merge(x,z),y);
		}
		puts("");
	}
}t;
int main()
{
	n=read(),m=read(),t.tot[0]=t.val[0]=t.siz[0]=0;
	for(ll i=1;i<=n;i++)
	{
		ll k=read();
		while(k--)
		{
			ll x=read()+1;
			w[i][x]=read();
		}
	}
	for(ll i=1;i<=m;i++) t.root[i]=t.build(i,1,n);
	Q=read();
	while(Q--)
	{
		cin>>opt;
		if(opt=="I") t.insert();
		else if(opt=="D") t.del();
		else if(opt=="QA") printf("%lld\n",t.siz[t.root[1]]);
		else t.query();
	}
	printf("end");
	return 0;
}
2024/3/8 17:35
加载中...