题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6703

给你一个数组两种操作。操作一是将pos位置的数字加上10000000;操作二是给你个r和k,问你最小的不小于k且没在数组a的[1,r]这个区间内出现过,并输出这个数。(pos,r,k均需异或上一次的答案,初始答案为零)。

因为k不大于n所以如果某个位置的数进行了操作一那么就代表下一次的操作二选出来的数可能是这个数。

我们用线段树维护最大的位置,线段树的节点表示值,节点存的是这个值在数组a中的位置。每次进行操作二时,我们查询线段树区间[k,n]内大于r的最小值。

因为如果进行了操作一后,线段树找出的值不一定就是最小的了,所以我们还要从所有进行了操作一的数中找出最小的且大于等于k的数,答案就是这两个数中最小的数。

#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define maxn 100005
int maxx[maxn<<],a[maxn],b[maxn],v[maxn];
int t,n,m;
inline void pushup(int rt)
{
maxx[rt]=max(maxx[rt<<],maxx[rt<<|]);
}
inline void build(int l,int r,int rt)
{
if(l==r)
{
maxx[rt]=b[l];
return ;
}
int mid=l+r>>;
build(ls);build(rs);
pushup(rt);
}
inline int fid(int k,int l,int r,int rt)//返回的是在不考虑操作一下符合的最小值
{
if(l==r)
{
if(maxx[rt]>=k)return l;
else return n+;
}
int mid=l+r>>;
int ret=n+;
//如果左儿子的最大值大于k,那么就往左区间找,因为这代表值在[l,mid]内的数有出现数组a的第r个之后的(r是题目给的r)
if(maxx[rt<<]>=k)ret=min(ret,fid(k,ls));
//如果右儿子的最大值大于k,那么就往右区间找
else if(maxx[rt<<|]>=k)ret=min(ret,fid(k,rs));
return ret;
}
inline int query(int L,int R,int k,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return fid(k,l,r,rt);
}
int mid=l+r>>;
int ret=n+;
if(L<=mid)ret=min(ret,query(L,R,k,ls));
if(R>mid)ret=min(ret,query(L,R,k,rs));
return ret;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=i;
v[i]=;
}
build(,n,);
int op,ans=;
set<int>s;
set<int>::iterator it;
while(m--)
{
scanf("%d",&op);
if(op==)
{
int pos;
scanf("%d",&pos);
pos^=ans;
if(!v[pos])
{
s.insert(a[pos]);
v[pos]=;
}
}
else
{
int r,k;
scanf("%d%d",&r,&k);
r^=ans;k^=ans;
ans=n+;//答案最大即为n+1
if(r!=n)
{
ans=query(k,n,r+,,n,);//查询区间[k,n]内大于r+1的最小的数
}
it=s.lower_bound(k);//从进行了操作一的数中找到符合条件的最小值
if(it!=s.end())
{
ans=min(ans,(*it));//取最小的一个
}
printf("%d\n",ans);
}
}
}
return ;
}

最新文章

  1. 7.1数据注解属性--Key【Code-First系列】
  2. He faced a maximum sentence of three years.
  3. 全面总结Java泛型
  4. 《The Linux Command Line》 读书笔记03 ls命令与长格式输出解释 文件权限
  5. 东大OJ-Max Area
  6. Cocoapods的安装报错 - Error installing pods:activesupport requires Ruby version &gt;=2.2.2
  7. sql跨数据库转移
  8. 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
  9. SparkSQL JSON数据操作(1.3-&gt;1.4)
  10. If-Modified-Since和If-None-Match
  11. FZU 1914 Funny Positive Sequence(线性算法)
  12. UDP网络程序模型设计
  13. AbpZero双重认证之短信的坑
  14. Android 编程之入门开发目录管理器开发文件事件操作-2
  15. UniCode 下 CString 转 char* 的方法(转)
  16. Vue源码解析(二):数据驱动
  17. django——简介
  18. mysql学习笔记--数据库索引
  19. Hdoj 2899.Strange fuction 题解
  20. python之全局变量和局部变量

热门文章

  1. java声明异常(throws)
  2. 在HTML中的下拉框中怎样实现超连接?
  3. D Thanking-Bear magic
  4. 备战省赛组队训练赛第五场(UPC)
  5. Shave Beaver! CodeForces - 331B2 (线段树)
  6. ELK系统分析nginx日志
  7. cglib的动态代理
  8. docker 挂载目录挂载不上**
  9. 雪花算法 Snowflake &amp; Sonyflake
  10. 从头学pytorch(九):模型构造