tzhpxc
#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的更多相关文章
随机推荐
- PAT 1048 数字加密(20)(代码+思路)
1048 数字加密(20)(20 分) 本题要求实现一种数字加密方法.首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取 ...
- 剑指offer面试题3二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 需要与面试官确认的是,这 ...
- MySql 几个小技巧
分页查看: 在 mysql 环境下,执行命令: pager more,之后的结果分屏了. 简明扼要地查看表结构: describe table_name
- 6. Manage the driver for browser and the script for Hub
- 《JavaScript DOM编程艺术》笔记
1. 把<script>标签放到HTML文档的最后,<body>标签之前能使浏览器更快地加载页面. 2. nodeType的常见取值 元素节点(1) 属性节点(2) 文本节点( ...
- python list和函数之间的复制和原地址修改问题
def change(a): a.pop() #自带的方法都是原地址修改 a=[,,] change(a) print (a)#直接修改了3. def change(a): a=[,,,] #复制操作 ...
- eclipse怎样检出SVN项目
首先确定你的eclipse安装了svn插件.查看eclipse是否安装插件的方法:打开eclipse->文件->新建->其他 ,在弹出的选择向导窗口中如果能搜索到svn,说明ecli ...
- Dice 5 ==> dice 7
https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...
- jquery报.live() is not a function的解决方法
jquery报.live() is not a function的解决方法: jquery中的live()方法在jquery1.9及以上的版本中已被废弃了,如果使用,会抛出TypeError: $(. ...
- 程序员面试50题(1)—查找最小的k个元素[算法]
题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数 ...