#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. WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [] milliseconds.

    编译安装tomcat-native和tomcat-deamon以后,发现toomcat启动很慢,好久才有响应.以下日志供参考: 11-Sep-2017 12:19:28.102 INFO [main] ...

  2. web前端js 实现打印操作

    转载来源:https://www.cnblogs.com/potatog/p/7412905.html 一.打印当前页面指定元素中的内容 方式一:直接使用window.print(); (1)首先获得 ...

  3. Laravel 处理 Options 请求的原理以及批处理方案

    0. 背景 在前后端分离的应用中,需要使用CORS完成跨域访问.在CORS中发送非简单请求时,前端会发一个请求方式为OPTIONS的预请求,前端只有收到服务器对这个OPTIONS请求的正确响应,才会发 ...

  4. OSGi 系列(十六)之 JDBC Service

    OSGi 系列(十六)之 JDBC Service compendium 规范提供了 org.osgi.service.jdbc.DataSourceFactory 服务 1. 快速入门 1.1 环境 ...

  5. vs 2015 运行安卓报错

    vs2015 start Android 错误信息如下: Severity Code Description Project File Line Suppression StateError java ...

  6. 20155210 2016-2017-2 《Java程序设计》第7周学习总结

    20155210 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量: GMT(Greenwich Mean Time)时间:现在不是标准时间 世界时 ...

  7. ORACLE 查看分区表分区大小

    SELECT *  FROM dba_segments t WHERE t.segment_name ='table_name'; pratition_name : 分区名 bytes : 分区大小( ...

  8. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

  9. UVaLive 2796 Concert Hall Scheduling (最小费用流)

    题意:个著名的音乐厅因为财务状况恶化快要破产,你临危受命,试图通过管理的手段来拯救它,方法之一就是优化演出安排,既聪明的决定接受或拒绝哪些乐团的演出申请,使得音乐厅的收益最大化.该音乐厅有两个完全相同 ...

  10. JavaNIO学习一

    文章来源:http://cucaracha.iteye.com/blog/2041847 对文件来说,可能最常用的操作就是创建.读取和写出.NIO.2 提供了丰富的方法来完成这些任务.本文从简单的小文 ...