#include<bits/stdc++.h>

using namespace std;

int nxt[200100],las[200100],ct,va[200010],pos[410],n,m,num[410][100010],bs,c2;

int get(int x){

if(x%bs0)return x/bs;

return x/bs+1;

}

void del(int x){

int nv=nxt[nxt[x]];

las[nv]=x;

nxt[x]=nv;

}

void ins(int x,int y){

ct++;

if(!las[x]){

nxt[ct]=x;

las[x]=ct;

va[ct]=y;

return;

}

int lv=las[x];

nxt[ct]=x;

las[x]=ct;

nxt[lv]=ct;

las[ct]=lv;

va[ct]=y;

}

int main(){

//freopen(“queue.in”,“r”,stdin);

//freopen(“queue.out”,“w”,stdout);

scanf("%d%d",&n,&m);

ct=1;

bs=sqrt(n);

if(bs*bs!=n)bs++;

for(int i=1;i<=n;i++){

int a;

scanf("%d",&a);

int ls=ct++;

las[ct]=ls;

nxt[ls]=ct;

va[ct]=a;

num[get(i)][a]++;

}

int x=2;

for(int i=1;i<=n;i++){

if((i-1)%bs0)pos[++c2]=x;

x=nxt[x];

}

while(m–){

int op,l,r,k;

scanf("%d%d%d",&op,&l,&r);

if(op1){

int ll,rr;

if(lr)continue;

if((l-1)%bs0)ll=(l-1)/bs+1;

else ll=(l-1)/bs+2;

rr=(r-1)/bs+1;

if(ll>rr){

ll=rr;

int x=pos[ll],y;

for(int i=(ll-1)*bs+1;i<l;i++)

x=nxt[x];

y=x;

for(int i=1;i<=r-l;i++)

y=nxt[y];

int tv=va[x];

x=las[x];

del(x);

ins(y,tv);

continue;

}

else if((r-1)%bs!=0){

int x=pos[rr],y=pos[ll],tv;

for(int i=(rr-1)*bs+1;i<r-1;i++)

x=nxt[x];

tv=va[nxt[x]];

for(int i=l;i<=(ll-1)*bs;i++)

y=las[y];

num[rr][tv]–;

del(x);

ins(y,tv);

if(ll!=1)num[ll-1][tv]++;

for(int i=ll;i<=rr;i++){

int lv=va[las[pos[i]]];

num[i][lv]++;

if(i!=1)num[i-1][lv]–;

pos[i]=las[pos[i]];

}

}

else{

int x=pos[rr],y=pos[ll],tv;

tv=va[x];

for(int i=l;i<=(ll-1)*bs;i++)

y=las[y];

num[rr][va[las[x]]]++;

num[rr-1][va[las[x]]]–;

num[rr][tv]–;

pos[rr]=las[pos[rr]];

del(pos[rr]);

ins(y,tv);

if(ll!=1)num[ll-1][tv]++;

for(int i=ll;i<rr;i++){

int lv=va[las[pos[i]]];

num[i][lv]++;

if(i!=1)num[i-1][lv]–;

pos[i]=las[pos[i]];

}

}

}

if(op2){

scanf("%d",&k);

int ll,rr,ans=0;

if((l-1)%bs==0)ll=(l-1)/bs+1;

else ll=(l-1)/bs+2;

rr=(r-1)/bs+1;

int x=pos[rr],y=pos[ll];

if(ll>rr){

ll=rr;

int x=pos[ll],ans=0;

for(int i=(ll-1)*bs+1;i<l;i++)

x=nxt[x];

if(va[x]==k)ans++;

for(int i=1;i<=r-l;i++){

x=nxt[x];

if(va[x]==k)ans++;

}

printf("%d\n",ans);

continue;

}

for(int i=(rr-1)*bs+1;i<=r;i++){

if(va[x]==k)ans++;

x=nxt[x];

}

y=las[y];

for(int i=l;i<=(ll-1)*bs;i++){

if(va[y]==k)ans++;

y=las[y];

}

for(int i=ll;i<rr;i++)

ans+=num[i][k];

printf("%d\n",ans);

}

}

}

tzhpxc的更多相关文章

随机推荐

  1. css浮动的元素居中

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. 学习socket的小例子

    /************************************************************** 技术博客 http://www.cnblogs.com/itdef/   ...

  3. 2018.07.09 顺序对齐(线性dp)

    顺序对齐 题目描述 考虑两个字符串右对齐的最佳解法.例如,有一个右对齐方案中字符串是 AADDEFGGHC 和 ADCDEGH. AAD~DEFGGHC ADCDE~~GH~ 每一个数值匹配的位置值 ...

  4. Django基础(二)

    https://www.cnblogs.com/yuanchenqi/articles/5716193.html

  5. webUploader上传视频,包括上传进度、上传状态、暂停和取消等

    踩坑视频上传: 点击开始上传: 头部引入webuploader.css <!DOCTYPE html> <html lang="en"> <head& ...

  6. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  7. jbpm(流程管理)

    1.jbpm是什么 JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理.工作流.服务协作等领域的一个开源的.灵活的.易扩展的可执行 ...

  8. hdu 2190 悼念512汶川大地震遇难同胞——重建希望小学

    题目 这道题拿到的时候拼凑了一会,感觉挺难的,然后博客说是:递推,我觉得递推其实就是找规律. 这是别人的思路:对于n米的长度,可以是由n-1长度加1而来,对于增加的1,只有三块1*1的砖一种铺法: 还 ...

  9. visual studio 2015 rc &cordova -hello world

    初始环境,用来看看书,电影,上上网的win8,所以一切从头开始. 1,首先还是装visual studio 2015  rc吧,目前只放出在线安装,所以要很长很长时间.不过有新闻说很快要实现中国网友至 ...

  10. swipe js bug

    最近因为要写新的mobile site页面,有好几个页面上面必须用到photo slider. 使用插件: /* * Swipe 2.0 * * Brad Birdsall * Copyright 2 ...