#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. js验证input输入正整数 和 输入的金额小数点后保留两位(PC端键盘输入)

    // 验证开头不为零的正整数 WST.zhengZhengShuIn = function (className){ var rex = /^[1-9]{1}[0-9]*$/;//正整数 $(&quo ...

  2. Linux dkpg命令

    一.简介 dpkg 是Debian Package 的简写,是Debian系列系统下的一个软件安装.更新及移除工具. 二.常用指令 1.查询功能 查看软件包信息: dpkg -info xxx.deb ...

  3. [freeCodeCamp] solution to JUGGLING ASYNC

    Here's the official solution in case you want to compare notes: var http = require('http') var bl = ...

  4. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  5. Vue.js2 + Laravel5 采用 CORS 方式解决 AJAX 跨域的问题

    一.建立中间件 php artisan make:middleware CorsAjax 二.编写中间件 CorsAjax <?phpnamespace App\Http\Middleware; ...

  6. ip白名单 通过* ? 检测IP匹配 轻量级

    #include "stdafx.h" #include <windows.h> #include <string.h> #include <asse ...

  7. 删除pdf文件所有超链接

    最近在读deep learning 书Bengio那本,在Github上面下载的,下载回来全都是超链接, 超级烦,比如点一下梯度下降法,就直接跳转到数后尾的index. 我看书还喜欢老点,所以要把他们 ...

  8. 开始Java之旅

      从今天起,cgg将给大家讲讲Java这种神奇的东西.   至于配置环境变量,大家可以看看我的博客:环境变量上面有详细解释.   下面先给大家一个公式:    public class [文件名]{ ...

  9. 2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)

    传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[ ...

  10. Nginx upstream的5种权重分配方式(转)

    出处:http://www.cnblogs.com/funsion/p/4003499.html?utm_source=tuicool 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器, ...