64pts!
查看原帖
64pts!
866613
sansesantongshun楼主2024/4/22 22:03

rt

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],b[100005][2],cn[170][100005],c[170][100005],d[170][320],e[100005],ee[170][100005],l1[170],r1[170],l2[320],r2[320],cc[100005],dd[320],s[605],k,l,r,x,y,z,bl,cnt;
inline int read()
{
	int result=0;
	char ch=getchar();
	while (ch<'0' || ch>'9')
	ch=getchar();
	while ('0'<=ch && ch<='9')
	{
		result=result*10+(ch^48);
		ch=getchar();
	}
	return result;
}
inline void write(int x)
{
	if (x>=10)
	write(x/10);
	putchar(x%10|48);
}
inline int find(int x)
{
	return x==e[x]?x:e[x]=find(e[x]);
}
inline void modify(int l,int r,int x,int y)
{
	s[0]=0;
	cnt=0;
	ee[b[l][0]][x]=0;
	ee[b[l][0]][y]=0;
	for (register int i=l1[b[l][0]];i<=r1[b[l][0]];++i)
	{
		a[i]=a[find(i)];
		if (a[i]==x || a[i]==y)
		s[++s[0]]=i;
	}
	for (register int i=l;i<=r;++i)
	if (a[i]==x)
	{
		a[i]=y;
		++cnt;
	}
	for (register int i=1;i<=s[0];++i)
	{
		if (ee[b[l][0]][a[s[i]]])
		e[s[i]]=ee[b[l][0]][a[s[i]]];
		else
		{
			e[s[i]]=s[i];
			ee[b[l][0]][a[s[i]]]=s[i];
		}
	}
	cn[b[l][0]][x]-=cnt;
	cn[b[l][0]][y]+=cnt;
	for (register int i=b[l][0];i<=b[n][0];++i)
	{
		c[i][x]-=cnt;
		c[i][y]+=cnt;
		if (b[x][1]!=b[y][1])
		{
			d[i][b[x][1]]-=cnt;
			d[i][b[y][1]]+=cnt;
		}
	}	
}
int main()
{
	n=read();
	m=read();
	for (register int i=1;i<=100000;++i)
	{
		b[i][1]=(i-1)/316+1;
		if (l2[b[i][1]]==0)
		l2[b[i][1]]=i;
		r2[b[i][1]]=i;
	}
	for (register int i=1;i<=n;++i)
	{
		a[i]=read();
		b[i][0]=(i-1)/600+1;
		if (l1[b[i][0]]==0)
		l1[b[i][0]]=i;
		r1[b[i][0]]=i;
		++cn[b[i][0]][a[i]];
		++c[b[i][0]][a[i]];
		++d[b[i][0]][b[a[i]][1]];
		if (ee[b[i][0]][a[i]])
		e[i]=ee[b[i][0]][a[i]];
		else
		{
		    e[i]=i;
		    ee[b[i][0]][a[i]]=i;
		}
	}
	for (register int i=1;i<=b[n][0];++i)
	{
		for (register int j=1;j<=100000;++j)
		c[i][j]+=c[i-1][j];
		for (register int j=1;j<=b[100000][1];++j)
		d[i][j]+=d[i-1][j];
	}
	while (m--)
	{
		k=read();
		if (k==1)
		{
			l=read();
			r=read();
			x=read();
			y=read();
			if (b[l][0]==b[r][0])
			modify(l,r,x,y);
			else
			{
				modify(l,r1[b[l][0]],x,y);
				modify(l1[b[r][0]],r,x,y);
				cnt=0;
				for (register int i=b[l][0]+1;i<b[r][0];++i)
				{
					if (ee[i][x])
					{
						if (ee[i][y])
						e[ee[i][x]]=ee[i][y];
						else
						{
							a[ee[i][x]]=y;
							ee[i][y]=ee[i][x];
						}
						ee[i][x]=0;
						cn[i][y]+=cn[i][x];
						cnt+=cn[i][x];
						cn[i][x]=0;
					}
					c[i][x]-=cnt;
					c[i][y]+=cnt;
					if (b[x][1]!=b[y][1])
					{
						d[i][b[x][1]]-=cnt;
						d[i][b[y][1]]+=cnt;
					}
				}
				for (register int i=b[r][0];i<=b[n][0];++i)
				{
					c[i][x]-=cnt;
					c[i][y]+=cnt;
					if (b[x][1]!=b[y][1])
					{
						d[i][b[x][1]]-=cnt;
						d[i][b[y][1]]+=cnt;
					}
				}
			}
		}
		else
		{
			x=read();
			y=read();
			z=read();
			if (b[x][0]==b[y][0])
			{
				for (register int i=x;i<=y;++i)
				{
					a[i]=a[find(i)];
					++cc[a[i]];
					++dd[b[a[i]][1]];
				}
				for (bl=1;bl<=b[100000][1];++bl)
				{
					if (z-dd[bl]<=0)
					break;
					z-=dd[bl];
				}
				for (register int i=l2[bl];i<=r2[bl];++i)
				{
					if (z-cc[i]<=0)
					{
						write(i);
						putchar('\n');
						break;
					}
					z-=cc[i];
				}
				for (int i=x;i<=y;++i)
				{
					cc[a[i]]=0;
					dd[b[a[i]][1]]=0;
				}
			}
			else
			{
				for (register int i=x;b[i][0]==b[x][0];++i)
				{
					a[i]=a[find(i)];
					++cc[a[i]];
					++dd[b[a[i]][1]];
				}
				for (register int i=y;b[i][0]==b[y][0];--i)
				{
					a[i]=a[find(i)];
					++cc[a[i]];
					++dd[b[a[i]][1]];
				}
				for (bl=1;bl<=b[100000][1];++bl)
				{
					if (z-dd[bl]-d[b[y][0]-1][bl]+d[b[x][0]][bl]<=0)
					break;
					z-=dd[bl]+d[b[y][0]-1][bl]-d[b[x][0]][bl];
				}
				for (register int i=l2[bl];i<=r2[bl];++i)
				{
					if (z-cc[i]-c[b[y][0]-1][i]+c[b[x][0]][i]<=0)
					{
						write(i);
						putchar('\n');
						break;
					}
					z-=cc[i]+c[b[y][0]-1][i]-c[b[x][0]][i];
				}
				for (register int i=x;b[i][0]==b[x][0];++i)
				{
					cc[a[i]]=0;
					dd[b[a[i]][1]]=0;
				}
				for (register int i=y;b[i][0]==b[y][0];--i)
				{
					cc[a[i]]=0;
					dd[b[a[i]][1]]=0;
				}
			}
		}
	}
}
2024/4/22 22:03
加载中...