給出一個長爲 nnn 的數列,以及 nnn 個操做,操做涉及單點插入,單點詢問,數據隨機生成。html
第一行輸入一個數字 nnn。ios
第二行輸入 nnn 個數字,第 i 個數字爲 aia_iai,以空格隔開。ui
接下來輸入 nnn 行詢問,每行輸入四個數字 opt\mathrm{opt}opt、lll、rrr、ccc,以空格隔開。spa
若 opt=0\mathrm{opt} = 0opt=0,表示在第 lll 個數字前插入數字 rrr (ccc 忽略)。code
若 opt=1\mathrm{opt} = 1opt=1,表示詢問 ara_rar 的值(lll 和 ccc 忽略)。htm
對於每次詢問,輸出一行一個數字表示答案。blog
4 1 2 2 3 0 1 3 1 1 1 4 4 0 1 2 2 1 1 2 4
2 3
對於 100% 100\%100% 的數據,1≤n≤100000,−231≤others 1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1≤n≤100000,−231≤others、ans≤231−1 \mathrm{ans} \leq 2^{31}-1ans≤231−1。ip
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define maxn 2010 using namespace std; int n,block,p,T,a[maxn][maxn],b[maxn][maxn],len[maxn]; void reset(){ int y=0,k=p/block,ll=0; if(p%block!=0)k++; p+=block;block=sqrt(p); T=0; for(int i=1;i<=k;i++) for(int j=1;j<=len[i];j++){ y++; int kk=(y-1)/block+1; b[kk][++ll]=a[i][j]; a[i][j]=0; if(ll==block)ll=0; } k=p/block; if(p%block!=0)k++; for(int i=1;i<=k;i++){ if(i!=k||p%block==0)len[i]=block; else len[i]=p-block*block; for(int j=1;j<=len[i];j++)a[i][j]=b[i][j]; } } int main(){ scanf("%d",&n);p=n;block=sqrt(n); for(int i=1;i<=n;i++){ int k=(i-1)/block+1; int x;scanf("%d",&x); a[k][++len[k]]=x; } T=0; for(int i=1;i<=n;i++){ int op,l,r,c; scanf("%d%d%d%d",&op,&l,&r,&c); if(op==0){ int k=0,t; for(t=1;t<=block;t++){ if(k+len[t]>=l)break; k+=len[t]; } len[t]++; for(int j=len[t];j>=l-k+1;j--) a[t][j]=a[t][j-1]; a[t][l-k]=r; T++; if(T==block)reset(); } else { int k=0,t; for(t=1;t<=block;t++){ if(k+len[t]>=r)break; k+=len[t]; } printf("%d\n",a[t][r-k]); } } return 0; }