Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
27912 baka24 【BJ】T2 C++ 运行超时 65 1999 MS 1752 KB 3010 2024-03-31 14:09:41

Tests(13/20):


#include<bits/stdc++.h> using namespace std; #define lson pos<<1 #define rson pos<<1|1 #define pii pair<int,int> #define fr first #define sc second #define mk make_pair const int MAXN=50010,N=32,ie9=2147483647; int n,m,k,a[MAXN],t[MAXN<<2]; struct asking{ int opt,x,y,as; }q[MAXN]; void pushup(int pos){ t[pos]=t[lson]|t[rson]; } void build(int pos,int l,int r){ if(l==r){ t[pos]=a[l]; return; } int mid=(l+r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushup(pos); } void update(int pos,int l,int r,int x,int y){ if(l==r){ t[pos]=y; return; } int mid=(l+r)>>1; if(x<=mid)update(lson,l,mid,x,y); else update(rson,mid+1,r,x,y); pushup(pos); } pii query(int pos,int l,int r,int x,int y,int p){ //cout<<pos<<" "<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<t[pos]<<" "<<t[lson]<<" "<<t[rson]<<endl; if(l==r)return mk(t[pos],1); int mid=(l+r)>>1; if(mid<x)return query(rson,mid+1,r,x,y,p); if(x<=l){ if((t[lson]|p)>=y){ return query(lson,l,mid,x,y,p); } pii tmp=query(rson,mid+1,r,x,y,p|t[lson]); return mk(tmp.fr|t[lson],tmp.sc+mid-l+1); } pii tmpl=query(lson,l,mid,x,y,p); if((tmpl.fr|p)>=y)return tmpl; if((tmpl.fr|t[rson]|p)<y)return mk(tmpl.fr|t[rson],tmpl.sc+r-mid); pii tmpr=query(rson,mid+1,r,x,y,p|tmpl.fr); return mk(tmpl.fr|tmpr.fr,tmpl.sc+tmpr.sc); } inline void slv1(){ for(int i=1;i<=m;i++){ int opt=q[i].opt,x=q[i].x,y=q[i].y; if(opt==1){ a[x]=y; } else{ int ans=ie9; for(int i=1;i<=n;i++){ int tmp=0; for(int j=i;j<=n;j++){ tmp|=a[j]; if(tmp>=x){ ans=min(ans,j-i+1); break; } } } printf("%d\n",ans==ie9?-1:ans); } } } void slv2(){ a[n+1]=2147483647; n++; build(1,1,n); for(int i=1;i<=m;i++){ int opt=q[i].opt,x=q[i].x,y=q[i].y; if(opt==1){ update(1,1,n,x,y); } else{ int ans=ie9; for(int i=1;i<n;i++){ pii tmp=query(1,1,n,i,x,0); //cout<<i<<" "<<tmp.fr<<" "<<tmp.sc<<endl; if(tmp.sc==n-i+1)break; ans=min(ans,tmp.sc); } printf("%d\n",ans==ie9?-1:ans); } } } void slv(){ bool n1=1; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=m;i++){ scanf("%d",&q[i].opt); if(q[i].opt==1){n1=0; scanf("%d%d",&q[i].x,&q[i].y); } else { scanf("%d",&q[i].x); } } if(n<=100&&m<=100)slv1(); else slv2(); } signed main(){ slv(); return 0; }


测评信息: