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;
}