loj #6282. 數列分塊入門 6

#6282. 數列分塊入門 6

題目描述

給出一個長爲 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}1n100000,231​​others、ans≤231−1 \mathrm{ans} \leq 2^{31}-1ans231​​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;
}
相關文章
相關標籤/搜索