提交时间:2024-03-31 17:26:40

运行 ID: 27978

#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 m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=5e4+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,a[maxn],bel[maxn],sum[maxn],len; vector<pi>pre[maxn],suf[maxn]; int f[500][500]; bool vis[500]; void bd(int x){ up(i,1,len)f[x][i]=0; int l=(x-1)*len+1,r=min(x*len,n); pre[x].clear(); pre[x].p_b(m_p(l,a[l])); up(i,l+1,r){ int val=pre[x].back().p2; if(val!=(val|a[i]))pre[x].p_b(m_p(i,val)); } suf[x].clear(); suf[x].p_b(m_p(r,a[r])); down(i,r-1,l){ int val=suf[x].back().p2; if(val!=(val|a[i]))suf[x].p_b(m_p(i,val)); } reverse(suf[x].begin(),suf[x].end()); sum[x]=pre[x].back().p2; vector<pi>vec; up(i,l,r){ vector<pi>tmp;down(j,29,0)if((a[i]>>j)&1)tmp.p_b(m_p(i,j)); for(auto it:vec)if((a[i]>>it.p2)&1);else tmp.p_b(it);vec=tmp; int g=0; for(auto it:vec){ g|=(1<<it.p2);f[x][i-it.p1+1]=max(f[x][i-it.p1+1],g); } } up(i,1,len)f[x][i]=max(f[x][i-1],f[x][i]); } int qry(int lim){ up(i,1,n)if(vis[i])bd(i),vis[i]=0; int res=n+1; vector<pi>T; up(i,1,bel[n]){ if(sum[i]>=lim)res=min(res,int(lower_bound(f[i]+1,f[i]+len+1,lim)-f[i])); int p=0; for(auto it:pre[i]){ while(p<int(T.size())&&(T[p].p1|it.p1)>=lim)p++;p--; p=max(p,0); if(p<int(T.size())&&(T[p].p1|it.p1)>=lim)res=min(res,it.p2-T[p].p2+1); } for(auto &it:T)it.p2|=sum[i]; while(T.size()&&T.back().p2==sum[i])T.pop_back(); for(auto it:suf[i]){ if(T.empty())T.p_b(it); else if(it.p1!=T.back().p1)T.p_b(it); } } if(res==n+1)res=-1; return res; } void slv(){ n=read(),q=read(); len=sqrt(n);up(i,1,n)a[i]=read(),bel[i]=(i-1)/len+1; up(i,1,bel[n])bd(i); while(q--){ int op=read(); if(op==1){ int x=read(),y=read(); a[x]=y,vis[bel[x]]=1; }else { int x=read(); printf("%d\n",qry(x)); } } } int main(){ slv(); return 0; } //LYLAKIOI