求调代码
查看原帖
求调代码
537046
大眼仔Happy楼主2022/12/18 19:53

rt,错最后一个点。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e5+5;
int n,m;ll p;
ll a[N],tong[N];
ll s1,s3;
struct Segment_Tree
{
	ll t[N<<2];
	void up(int k){t[k]=min(t[k<<1],t[k<<1|1]);}
	void build(int k,int l,int r)
	{
		if(l==r){t[k]=a[l];return;}
		int mid=(l+r)>>1;
		build(k<<1,l,mid);build(k<<1|1,mid+1,r);
		up(k);
	}
	void upd(int k,int l,int r,int q,int v)
	{
		if(l==r){t[k]=v;return;}
		int mid=(l+r)>>1;
		if(q<=mid)upd(k<<1,l,mid,q,v);
		else upd(k<<1|1,mid+1,r,q,v);
		up(k);
	}
}T;
ll QuickPow(ll a,ll b)
{
	ll res=1;
	while(b>0)
	{
		if(b&1)res=(res*a)%p;
		a=(a*a)%p;b>>=1;
	}
	return res;
}
ll calc()
{
	if(s3)return 0;
	ll Min=T.t[1];
	if(tong[Min]!=1)return 0;
	return QuickPow(2,s1-1);
}
int main(){
	scanf("%d%d%lld",&n,&m,&p);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),tong[a[i]]++;
	T.build(1,1,n);
	for(int i=1;i<=n;i++)
	{
		if(tong[i]==1)s1++;
		if(tong[i]==3)s3++;
	}
	printf("%lld\n",calc());
	while(m--)
	{
		int x,k;
		scanf("%d%d",&x,&k);
		//del
		if(tong[a[x]]==3)s3--;
		if(tong[a[x]]==2)s1++;
		if(tong[a[x]]==1)s1--;
		tong[a[x]]--;
		//add
		if(tong[k]==0)s1++;
		if(tong[k]==1)s1--;
		if(tong[k]==2)s3++;
		tong[k]++;
		//
		T.upd(1,1,n,x,k);a[x]=k;
		printf("%lld\n",calc());
	}
	return 0;
}
2022/12/18 19:53
加载中...