提交时间:2024-09-15 20:05:21
运行 ID: 32624
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair #define ppc __builtin_popcount using namespace std; typedef long long ll; const int maxn=1e6+10; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,q;ll k; struct node { int ls,rs,siz; }d[maxn*30]; int rt=1,ct=1; #define ls(p) d[p].ls #define rs(p) d[p].rs #define siz(p) d[p].siz void ins(ll &x,int c){ int p=rt;siz(p)+=c; down(i,59,0){ if((x>>(ll)i)&1){ if(!rs(p))rs(p)=++ct;p=rs(p); }else { if(!ls(p))ls(p)=++ct;p=ls(p); }siz(p)+=c; } }int dp(int x,int y,int dep); int g(int x,int y,int dep){ return max(max(siz(x),siz(y)),dp(x,y,dep)); } int dp(int x,int y,int dep){ if((!x)||(!y))return siz(x|y); if(dep==-1)return ((x==y)?siz(x):siz(x)+siz(y)); if((k>>(ll)dep)&1){ if(x==y){ return g(ls(x),rs(x),dep-1); } int res=0; res+=g(ls(x),rs(y),dep-1); res+=g(rs(x),ls(y),dep-1); return res; }return max(dp(ls(x),ls(y),dep-1),dp(rs(x),rs(y),dep-1)); } ll a[maxn]; void slv(){ n=read(),q=read(),k=read()-1; up(i,1,n)a[i]=read(),ins(a[i],1); if(k==-1){ up(i,1,q+1)printf("1\n");return; } printf("%d\n",dp(1,1,59)); while(q--){ int x=read(); ins(a[x],-1);a[x]=read();ins(a[x],1); printf("%d\n",dp(1,1,59)); } }int main(){ //freopen("anfang.in","r",stdin); //freopen("anfang.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }