#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. Spark设计思想浅析

    Spark is no rocket science!——博主 了解分布式计算的朋友,一定知道DAG这样一个概念.其实我接触DAG也是在学习MapReduce时了解到的.(具体可查阅<大数据日知 ...

  2. BZOJ2424 [HAOI2010]订货 - 费用流

    题解 (非常裸的费用流 题意有一点表明不清: 该月卖出的商品可以不用算进仓库里面. 然后套上费用流模板 代码 #include<cstring> #include<queue> ...

  3. Spring.NET学习笔记6——依赖注入(应用篇)

    1. 谈到高级语言编程,我们就会联想到设计模式:谈到设计模式,我们就会说道怎么样解耦合.而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny I ...

  4. python性能监控初试

    标 题: python性能监控初试作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990765.html 欢迎转帖 请保持文本完整并注明出处 之前性能统计 ...

  5. pandas replace函数使用小结

    http://blog.csdn.net/kancy110/article/details/72719340

  6. 如何优化Mysql数据库

    1.添加主键ID 2.尽量避免使用select * form table 3.创建索引     对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或 ...

  7. 2018.07.18 [NOI2018]归程(return)(kruskal重构树)

    传送门 新鲜出炉的noi2018试题. 下面讲讲这题的解法: 首先要学习一个叫做kruskal重构树的东东. 听名字就知道跟kruskal算法有关,没错,原来的kruskal算法就是用并查集实现的,但 ...

  8. test 测试spring容器类

  9. 关于EmitMapper,映射配置

    public static T Snapshoot<T>(this XtraForm form, T obj) { var config = new DefaultMapConfig(); ...

  10. DataGrid组件

    <?xml version="1.0" encoding="utf-8"?><s:WindowedApplication xmlns:fx=& ...