You come home and fell some unpleasant smell. Where is it coming from?

You are given an array a. You have to answer the following queries:

  1. You are given two integers l and r. Let ci be the number of occurrences of i inal: r, where al: r is the subarray of a from l-th element to r-th inclusive. Find the Mex of {c0, c1, ..., c109}
  2. You are given two integers p to x. Change ap to x.

The Mex of a multiset of numbers is the smallest non-negative integer not in the set.

Note that in this problem all elements of a are positive, which means that c0 = 0 and 0 is never the answer for the query of the second type.

Input

The first line of input contains two integers n and q (1 ≤ n, q ≤ 100 000) — the length of the array and the number of queries respectively.

The second line of input contains n integers — a1a2, ..., an (1 ≤ ai ≤ 109).

Each of the next q lines describes a single query.

The first type of query is described by three integers ti = 1, liri, where 1 ≤ li ≤ ri ≤ n — the bounds of the subarray.

The second type of query is described by three integers ti = 2, pixi, where 1 ≤ pi ≤ n is the index of the element, which must be changed and 1 ≤ xi ≤ 109 is the new value.

Output

For each query of the first type output a single integer  — the Mex of{c0, c1, ..., c109}.

Example

Input
10 4
1 2 3 1 1 2 2 2 9 9
1 1 1
1 2 8
2 7 1
1 2 8
Output
2
3
2

Note

The subarray of the first query consists of the single element — 1.

The subarray of the second query consists of four 2s, one 3 and two 1s.

The subarray of the fourth query consists of three 1s, three 2s and one 3.

注意离散化 ,更换点也要加入数组里面进行离散化

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5 + ;
int n, m, tim, L, R, tot, sz, qsz;
int sum[maxn], cnt[maxn], ans[maxn], now[maxn];
int a[maxn], b[maxn];
struct node {
int l, r, id, t;
node() {}
node(int l, int r, int id, int t): l(l), r(r), id(id), t(t) {}
} qu[maxn];
struct node1 {
int pos, x, y;
node1() {}
node1(int pos, int x, int y): pos(pos), x(x), y(y) {}
} c[maxn];
int cmp(node a, node b) {
if (a.l / sz == b.l / sz) {
if (a.r / sz == b.r / sz) return a.t < b.t;
return a.r < b.r;
}
return a.l < b.l;
}
void add(int val) {
cnt[sum[val]]--;
sum[val]++;
cnt[sum[val]]++;
}
void del(int val) {
cnt[sum[val]]--;
sum[val]--;
cnt[sum[val]]++;
}
void change(int pos, int x) {
if (L <= pos && pos <= R) {
del(now[pos]);
add(x);
}
now[pos] = x;
}
int main() {
scanf("%d%d", &n, &m);
sz = (int)pow(n, 0.66666667);
for (int i = ; i <= n ; i++) {
scanf("%d", &a[i]);
b[++tot] = a[i];
now[i] = a[i];
}
qsz = tim = ;
for (int i = ; i <= m ; i++) {
int op;
scanf("%d", &op);
if (op == ) {
int l, r;
scanf("%d%d", &l, &r);
qu[++qsz] = node(l, r, qsz, tim);
} else {
int pos, x;
scanf("%d%d", &pos, &x);
b[++tot] = x;
c[++tim] = node1(pos, x, now[pos]);
now[pos] = x;
}
}
sort(qu + , qu + qsz + , cmp);
sort(b + , b + tot + );
tot = unique(b + , b + tot + ) - b;
for (int i = ; i <= n ; i++)
now[i] = lower_bound(b + , b + tot + , a[i]) - b;
for (int i = ; i <= tim ; i++) {
c[i].x = lower_bound(b + , b + tot + , c[i].x) - b;
c[i].y = lower_bound(b + , b + tot + , c[i].y) - b;
}
tim = ;
for (int i = ; i <= qsz ; i++) {
while(L > qu[i].l) add(now[--L]);
while(R < qu[i].r) add(now[++R]);
while(L < qu[i].l) del(now[L++]);
while(R > qu[i].r) del(now[R--]);
while(tim < qu[i].t) tim++, change(c[tim].pos, c[tim].x);
while(tim > qu[i].t) change(c[tim].pos, c[tim].y), tim--;
int mex = ;
while(cnt[mex] > ) mex++;
ans[qu[i].id] = mex;
}
for (int i = ; i <= qsz ; i++ )
printf("%d\n", ans[i]);
return ;
}

Machine Learning CodeForces - 940F (带修改的莫队)的更多相关文章

  1. codeforces 940F 带修改的莫队

    F. Machine Learning time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

  2. Machine Learning Codeforces - 940F(带修莫队) && 洛谷P4074 [WC2013]糖果公园

    以下内容未验证,有错请指正... 设块大小为T,则块数为$\frac{n}{T}$ 将询问分为$(\frac{n}{T})^2$块(按照左端点所在块和右端点所在块分块),同块内按时间从小到大依次处理 ...

  3. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

  4. 【BZOJ】2120: 数颜色 带修改的莫队算法

    [题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...

  5. 【bzoj4129】Haruna’s Breakfast 带修改树上莫队+分块

    题目描述 给出一棵树,点有点权.支持两种操作:修改一个点的点权,查询链上mex. 输入 第一行包括两个整数n,m,代表树上的结点数(标号为1~n)和操作数.第二行包括n个整数a1...an,代表每个结 ...

  6. 【bzoj3052】[wc2013]糖果公园 带修改树上莫队

    题目描述 给出一棵n个点的树,每个点有一个点权,点权范围为1~m.支持两种操作:(1)修改一个点的点权 (2)对于一条路径,求$\sum\limits_{i=1}^m\sum\limits_{j=1} ...

  7. P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队

    \(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...

  8. UOJ 58 (树上带修改的莫队)

    UOJ 58 糖果公园 Problem : 给一棵n个点的树,每个点上有一种颜色,对于一条路径上的点,若 i 颜色第 j 次出现对该路径权值的贡献为 w[i] * c[j], 每次询问一条路径的权值, ...

  9. UVA - 12345 带修改的莫队

    题意显然:给出初始序列,单点修改,区间查询元素的种类. 由于时限过宽,暴力可过. 比较优秀的解法应该是莫队. 带修改的莫队题解可以看https://www.luogu.org/blog/user126 ...

随机推荐

  1. 数据库Mysql的学习(二)-数据类型和创建

    数据类型:数据列,存储过程参数,表达式和局部变量的数据特征. 整形: tinyint:一个字节,-128到127:2的7次方 smallint:两个字节,-32768到32767:2的15次方 med ...

  2. django request bug

    bug描述:django请求request接收数据时,如果参数中包含分号时,会导致分号后面的消息丢失. 比如前台js调用代码 $.post('/get_params', { "A" ...

  3. c# 批量处理数据录入

    c# 分批处理数据录入 //using System.Text; //using System.Data; //using System.Data.SqlClient; //using System; ...

  4. php性能优化--opcache

    一.OPcache是什么? OPcache通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. PHP 5 ...

  5. [基于NetCore的简单博客系统]-登录

    0-项目背景 一个基于.NET CORE RAZOR PAGES的简单博客系统 技术栈全部采用微软官方实现方式,目的是熟悉新技术 项目地址:https://github.com/ganqiyin/BL ...

  6. ACM 第六天

    图论 网络流 最大流 INF(初始值) 路径上权值最小的边,决定流量大小. 流量网络的三个特性: ①流量控制 ②反对称性 ③流量守恒 残余网络:保留了c(e)容量<f(e)流量[可以继续流,因为 ...

  7. python学习笔记02:运行python程序

    1.启动cmd命令行,输入python后回车,运行python解释器: 输入python代码后回车: print('Hello World')

  8. TCP系列23—重传—13、RACK重传

    一.RACK概述 RACK(Recent ACKnowledgment)是一种新的基于时间的丢包探测算法,RACK的目的是取代传统的基于dupthresh门限的各种快速重传及其变种.前面介绍的各种基于 ...

  9. c++设计模式----装饰模式

    前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...

  10. 软工网络15团队作业——Alpha阶段敏捷冲刺 DAY1

    Alpha阶段敏捷冲刺 DAY1 1.各个成员在 Alpha 阶段认领的任务 姓名 在Alpha阶段所认领的任务 陈龙 题目生成类的编写,随机生成合理题目的算法编写 郑佳明 答案计算类的编写,对随机生 ...