rt,题目是数列分块入门 6。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10,sqn=sqrt(maxn);
struct node{
int a[(sqn<<1)+10],size;
node* nxt;
node(){size=0;nxt=nullptr,memset(a,0,sizeof a);}
void push_back(int c){a[size++]=c;}
}*p=new node,*head=p;
bool check(node* p){
if(p->size<(sqn<<1))return 0;
node* q=new node;
for(int i=sqn;i<=p->size;i++)q->push_back(p->a[i]);
p->size=sqn;q->nxt=p->nxt;p->nxt=q;
return 1;
}
void insert(int pos,int c){
node* p=head;
int tot;
for(tot=head->size;tot<pos;p=p->nxt,tot+=p->size);
tot-=p->size;
for(int i=p->size-1;i>=pos-tot;i--)p->a[i+1]=p->a[i];
p->a[pos-tot]=c;p->size++;
check(p);
}
int query(int pos){
node* p=head;
int tot;
for(tot=head->size;tot<pos;p=p->nxt,tot+=p->size);
tot-=p->size;
return p->a[pos-tot];
}
int n,a;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a,p->push_back(a);
if(check(p))p=p->nxt;
}
for(int i=1;i<=n;i++){
int op,l,r,c;
cin>>op>>l>>r>>c;
if(op==0)insert(l-1,r);
if(op==1)cout<<query(r-1)<<endl;
}
return 0;
}