题目链接:点击传送
思路:分块
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define eps 1e-14 #define bug(x) cout<<"bug"<<x<<endl; const int N=2e5+10,M=1e6+10,inf=2147483647; const ll INF=1e18+10,mod=1e9+7; /// 数组大小 int n,q,k; int a[N],b[N],pos[N]; int si[N],st[N]; void update(int L,int R,int l) { if(pos[L]==pos[R]) { if(si[pos[L]]) for(int i=(pos[L]-1)*k+1,j=st[pos[L]];i<=pos[L]*k;i++,j++) b[i]=a[j]; si[pos[L]]=0; for(int i=L,j=0;i<=R;i++,j++) b[i]=a[l+j]; return; } if(si[pos[L]]) for(int i=(pos[L]-1)*k+1,j=st[pos[L]];i<=pos[L]*k;i++,j++) b[i]=a[j]; si[pos[L]]=0; for(int i=L;i<=pos[L]*k;i++) b[i]=a[l++]; for(int i=pos[L]+1;i<=pos[R]-1;i++,l+=k) { si[i]=1; st[i]=l; } if(si[pos[R]]) for(int i=(pos[R]-1)*k+1,j=st[pos[R]];i<=pos[R]*k;i++,j++) b[i]=a[j]; si[pos[R]]=0; for(int i=(pos[R]-1)*k+1;i<=R;i++) b[i]=a[l++]; } int query(int x) { if(si[pos[x]]) { int l=x-(pos[x]-1)*k-1; return a[st[pos[x]]+l]; } else return b[x]; } int main() { scanf("%d%d",&n,&q); k=sqrt(n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),pos[i]=(i-1)/k+1; for(int i=1;i<=n;i++) scanf("%d",&b[i]); while(q--) { int t; scanf("%d",&t); if(t==1) { int x,y,l; scanf("%d%d%d",&x,&y,&l); update(y,y+l-1,x); } else { int x; scanf("%d",&x); printf("%d ",query(x)); } ///for(int i=1;i<=n;i++) /// printf("%d ",query(i)); /// printf(" "); } return 0; }