Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
27914 | yuanjiabao | 【BJ】T2 | C++ | 运行超时 | 5 | 1000 MS | 668 KB | 2264 | 2024-03-31 14:11:35 |
#include<iostream> #include<cmath> #include<cstring> #include<vector> using namespace std; const int N=50100,inf=0x3f3f3f3f,LG=31; int n,q,B; int a[N],L[N],R[N],sum[N],bel[N]; void init(){ cin>>n>>q; for(int i=1;i<=n;i++)cin>>a[i]; B=(int)sqrt(n); for(int i=1;i<=n;i++){ bel[i]=(i-1)/B+1; if(bel[i]!=bel[i-1])L[bel[i]]=i; if(bel[i]!=i/B+1||i==n)R[bel[i]]=i; sum[bel[i]]|=a[i]; } L[bel[n]+1]=n+1; R[bel[n]+1]=n; } void modify(int x,int y){ a[x]=y; sum[bel[x]]=0; for(int i=L[bel[x]];i<=R[bel[x]];i++)sum[bel[x]]|=a[i]; } int cnt[LG]; inline bool cmp(int k){ for(int i=LG-1;i>=0;i--){ if(cnt[i]&&!((k>>i)&1))return true; else if(!cnt[i]&&((k>>i)&1))return false; } return true; } inline void del(int x){for(int i=0;i<LG;i++)if((x>>i)&1)cnt[i]--;} inline void add(int x){for(int i=0;i<LG;i++)if((x>>i)&1)cnt[i]++;} inline int get_ans(int lb,int rb,int k){ int ans=inf; for(int i=lb;i<rb;i++)add(sum[i]); int r=L[rb]; for(int i=L[lb];i<=R[lb];i++){ while(r<=R[rb]&&!cmp(k))add(a[r++]); if(cmp(k))ans=min(ans,r-i); del(a[i]); } memset(cnt,0,sizeof(cnt)); return ans; } using pii=pair<int,int>; vector<pii>v; inline int get_ans(int k){ int ans=inf; int r=1; int lb=0,rb=0; v.clear(); for (int i=1;i<=bel[n];i++){ while(r<=bel[n]&&!cmp(k))add(sum[r++]); if(cmp(k)){ if(L[r]-L[i]<ans){ ans=L[r]-L[i]; lb=i,rb=r; v.clear(); v.emplace_back(make_pair(lb,rb)); } else if(L[r]-L[i]==ans){ v.emplace_back(make_pair(lb,rb)); } } del(sum[i]); } if(ans==inf)return -1; for(pii p:v)ans=min(ans,get_ans(p.first,p.second,k)); return ans; } signed main(){ // freopen("beaco.in","r",stdin); // freopen("beaco.out","w",stdout); init(); while(q--){ int opt;cin>>opt; if(opt==1){int x,y;cin>>x>>y;modify(x,y);} else { int k;cin>>k; printf("%d\n",get_ans(k)); } } return 0; }