F. MEX Queries
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given a set of integer numbers, initially it is empty. You should perform n queries.

There are three different types of queries:

  • l r — Add all missing numbers from the interval [l, r]
  • l r — Remove all present numbers from the interval [l, r]
  • l r — Invert the interval [l, r] — add all missing and remove all present numbers from the interval [l, r]

After each query you should output MEX of the set — the smallest positive (MEX  ≥ 1) integer number which is not presented in the set.

Input

The first line contains one integer number n (1 ≤ n ≤ 105).

Next n lines contain three integer numbers t, l, r (1 ≤ t ≤ 3, 1 ≤ l ≤ r ≤ 1018) — type of the query, left and right bounds.

Output

Print MEX of the set after each query.

Examples
input
3
1 3 4
3 1 6
2 1 3
output
1
3
1
input
4
1 1 3
3 5 6
2 4 4
3 1 6
output
4
4
4
1
Note

Here are contents of the set after each query in the first example:

  1. {3, 4} — the interval [3, 4] is added
  2. {1, 2, 5, 6} — numbers {3, 4} from the interval [1, 6] got deleted and all the others are added
  3. {5, 6} — numbers {1, 2} got deleted

题意:给你n个区间,1操作表示把[l,r]赋值为1,2操作表示把[l,r]赋值为0,3操作表示把[l,r]异或1;

     求第一个不为0的正整数。

思路:对于所有区间[l,r]取出l,r,r+1三个点;

   离散化放入线段树中去

   现在需要区间修改,区间异或,查询

   需要两个lazy标记,一个存修改的值,一个存是否异或1.

   区间查询log查找即可,详见代码。

   小trick:需要加入最小值,即是1的情况;

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<bitset>
#include<time.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-4
#define bug(x) cout<<"bug"<<x<<endl;
const int N=3e5+,M=4e6+,inf=,mod=1e9+;
const LL INF=1e18+,MOD=1e9+; int L=3e5+;
struct LT
{
int sum[N<<],to[N<<],sw[N<<];
void pushdown(int pos,int l,int r)
{
int mid=(l+r)>>;
if(to[pos]!=-)
{
to[pos<<]=to[pos];
to[pos<<|]=to[pos];
sum[pos<<]=to[pos]*(mid-l+);
sum[pos<<|]=to[pos]*(r-mid);
to[pos]=-;
sw[pos]=;
}
if(sw[pos])
{
if(to[pos<<]!=-)to[pos<<]=!to[pos<<];
else sw[pos<<]=!sw[pos<<];
if(to[pos<<|]!=-)to[pos<<|]=!to[pos<<|];
else sw[pos<<|]=!sw[pos<<|];
sum[pos<<]=(mid-l+)-sum[pos<<];
sum[pos<<|]=(r-mid)-sum[pos<<|];
sw[pos]=;
}
}
void build(int l,int r,int pos)
{
to[pos]=-;
sw[pos]=;
sum[pos]=;
if(l==r)return;
int mid=(l+r)>>;
build(l,mid,pos<<);
build(mid+,r,pos<<|);
}
void update(int L,int R,int c,int l,int r,int pos)
{
if(L<=l&&r<=R)
{
if(c==)
{
if(to[pos]!=-)to[pos]=!to[pos];
else sw[pos]=!sw[pos];
}
else
{
to[pos]=c;
sw[pos]=;
}
if(c==)sum[pos]=r-l+-sum[pos];
else sum[pos]=(r-l+)*c;
return;
}
pushdown(pos,l,r);
int mid=(l+r)>>;
if(L<=mid)update(L,R,c,l,mid,pos<<);
if(R>mid) update(L,R,c,mid+,r,pos<<|);
sum[pos]=sum[pos<<|]+sum[pos<<];
}
int query(int l,int r,int pos)
{
//cout<<l<<" "<<r<<" "<<sum[pos]<<" "<<to[pos]<<endl;
if(l==r)return l;
pushdown(pos,l,r);
//cout<<sum[pos<<1]<<" "<<sum[pos<<1|1]<<endl;
int mid=(l+r)>>;
if(sum[pos<<]==mid-l+)return query(mid+,r,pos<<|);
else return query(l,mid,pos<<);
}
}tree; int t[N],len;
LL l[N],r[N],s[N];
int getpos(LL x)
{
int pos=lower_bound(s+,s+len,x)-s;
return pos;
}
int main()
{
int n,k=;
scanf("%d",&n);
s[++k]=;
for(int i=;i<=n;i++)
scanf("%d%lld%lld",&t[i],&l[i],&r[i]),s[++k]=l[i],s[++k]=r[i],s[++k]=r[i]+;
sort(s+,s++k);
len=unique(s+,s++k)-s;
tree.build(,L,);
for(int i=;i<=n;i++)
{
int z=getpos(l[i]),y=getpos(r[i]);
if(t[i]==)tree.update(z,y,,,L,);
else if(t[i]==)tree.update(z,y,,,L,);
else if(t[i]==)tree.update(z,y,,,L,);
int x=tree.query(,L,);
//cout<<"xxx "<<x<<" "<<tree.sum[1]<<endl;
printf("%lld\n",s[x]);
}
return ;
}

Educational Codeforces Round 23 F. MEX Queries 离散化+线段树的更多相关文章

  1. [Codeforces]817F. MEX Queries 离散化+线段树维护

    [Codeforces]817F. MEX Queries You are given a set of integer numbers, initially it is empty. You sho ...

  2. Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)

    F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...

  3. Educational Codeforces Round 64 (Rated for Div. 2) (线段树二分)

    题目:http://codeforces.com/contest/1156/problem/E 题意:给你1-n  n个数,然后求有多少个区间[l,r] 满足    a[l]+a[r]=max([l, ...

  4. CF Educational Round 23 F.MEX Queries

    写了3小时 = =.这两天堕落了,昨天也刷了一晚上hihocoder比赛,还爆了零.之后得节制点了,好好准备考研.. 首先很容易想到 压缩数据 + 线段树 然后对于Pushdown真很难写..需要牵涉 ...

  5. Educational Codeforces Round 40 F. Runner's Problem

    Educational Codeforces Round 40 F. Runner's Problem 题意: 给一个$ 3 * m \(的矩阵,问从\)(2,1)$ 出发 走到 \((2,m)\) ...

  6. Educational Codeforces Round 23 A-F 补题

    A Treasure Hunt 注意负数和0的特殊处理.. 水题.. 然而又被Hack了 吗的智障 #include<bits/stdc++.h> using namespace std; ...

  7. Educational Codeforces Round 23 补题小结

    昨晚听说有教做人场,去补了下玩. 大概我的水平能做个5/6的样子? (不会二进制Trie啊,我真菜) A. 傻逼题.大概可以看成向量加法,判断下就好了. #include<iostream> ...

  8. 【Educational Codeforces Round 37 F】SUM and REPLACE

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...

  9. Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树

    C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...

随机推荐

  1. hud3007 Buried memory

    题目链接 最小圆覆盖 并不知道为什么是O(n)的,而且要随机化点的顺序 #include<algorithm> #include<iostream> #include<c ...

  2. NoSql Cassandra

    我们为什么要使用NOSQL非关系数据库? 随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速.而传统的关系数据库在应付web2.0网站,特别 ...

  3. MySQL底层索引剖析

    1:Mysql索引是什么 mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引.可简单理解为排好序的快速查找数据结构.如果要查“mysql” ...

  4. dropout——gluon

    https://blog.csdn.net/lizzy05/article/details/80162060 from mxnet import nd def dropout(X, drop_prob ...

  5. 机器学习笔记 1 LMS和梯度下降(批梯度下降) 20170617

    https://www.cnblogs.com/alexYuin/p/7039234.html # 概念 LMS(least mean square):(最小均方法)通过最小化均方误差来求最佳参数的方 ...

  6. git学习总结 - 纯命令

    全局安装git: npm intall git -g 查看git版本: git --version 进入目录,初始化git: 若在目录中使用上一个,不在目录中使用下一个. //已有目录: git in ...

  7. LogUtil工具

    package com.develop.web.util; import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logg ...

  8. python的zipfile、tarfile模块

    zipfile.tarfile的用法 先占个位置,后续再实际操作和补充 参考 https://www.cnblogs.com/MnCu8261/p/5494807.html

  9. jQuery实现广告弹窗

    首先设置一个固定的窗口位于右下角,效果如下: 代码: jQuery实现广告弹窗.html 之后将该窗口初始设为隐藏,通过代码实现3秒自动显示,5秒自动隐藏,其效果如下: <!DOCTYPE ht ...

  10. Web视频播放之video.js

    h5这么火是有它的理由的,支持原生视频播放,但是目前兼容性还不是很好,因此使用js框架支持网站视频播放是比较不错的选择. 下载video.js,我们可以通过官网去下,但是官网在国外,我尝试了几次均下载 ...