LOJ6282 数列分块入门6(分块+暴力)

真是暴力

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
vector<int> Vec[600];
int stack[250000],belong[250000],n,cnt,cntinsert=0,sz,blocknum;
void rebuild(void){
    for(int i=1;i<=blocknum;i++){
        for(int j=0;j<Vec[i].size();j++)
            stack[++cnt]=Vec[i][j];
        Vec[i].clear();
        }
    sz=sqrt(cnt);
    blocknum=cnt/sz;
    if(cnt/sz)
        blocknum++;
    for(int i=1;i<=cnt;i++)
        belong[i]=(i-1)/sz+1;
    for(int i=1;i<=cnt;i++)
        Vec[belong[i]].push_back(stack[i]);
    cnt=0;
}
void insert(int r,int c){
    int posi=1;
    while(posi<=blocknum&&r>Vec[posi].size()){
        r-=Vec[posi].size();
        posi++;
    }
    Vec[posi].insert(Vec[posi].begin()+r-1,c);
    if(Vec[posi].size()>20*sz)
        rebuild();
}
int query(int r){
    int posi=1;
    while(posi<=blocknum&&r>Vec[posi].size()){
        r-=Vec[posi].size();
        posi++;
    }
    return Vec[posi][r-1];
}
int main(){
    scanf("%d",&n);
    for(cnt=1;cnt<=n;cnt++)
        scanf("%d",&stack[cnt]);
    rebuild();
    for(int i=1;i<=n;i++){
        int opt,l,r,c;
        scanf("%d %d %d %d",&opt,&l,&r,&c);
        if(opt==0){
            insert(l,r);
            ++cntinsert;
        }
        else
            printf("%d\n",query(r));
    }
}
posted @ 2018-11-30 17:24  dreagonm  阅读(167)  评论(0编辑  收藏  举报