绝对是很好的题

把问题转化成当第i个询问的答案是数值x时是否可行

要判断值x是否可行,只要再将问题转化成a数组里>=x的值数量是否严格大于b数组里的>=x的值

那么线段树叶子结点维护对于值x的a数组里的合法数数量-b数组里的合法数数量,如果是正数即这个值可行

线段树维护区间最大值,然后询问最靠右的非负叶子下标

#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define maxn 1000005 int Q,n,m,a[maxn],b[maxn],ans[maxn];
struct Query{int op,i,x;}q[maxn];
vector<int>v; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int lazy[maxn<<],Max[maxn<<];
void pushdown(int rt){
if(lazy[rt]!=){
Max[rt<<]+=lazy[rt];
Max[rt<<|]+=lazy[rt];
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void pushup(int rt){
Max[rt]=max(Max[rt<<],Max[rt<<|]);
}
void update(int L,int R,int val,int l,int r,int rt){
if(L<=l && R>=r){
lazy[rt]+=val;
Max[rt]+=val;
return;
}
pushdown(rt);
int m=l+r>>;
if(L<=m)update(L,R,val,lson);
if(R>m)update(L,R,val,rson);
pushup(rt);
}
int query(int l,int r,int rt){
if(Max[rt]<=)return -;
if(l==r && Max[rt]>)return l;
pushdown(rt);
int m=l+r>>;
if(Max[rt<<|]>)
return query(rson);
else if(Max[rt<<]>)
return query(lson);
else return -;
} int main(){
cin>>n>>m;
for(int i=;i<=n;i++)scanf("%d",&a[i]),v.push_back(a[i]);
for(int i=;i<=m;i++)scanf("%d",&b[i]),v.push_back(b[i]);
cin>>Q;
for(int i=;i<=Q;i++){
scanf("%d%d%d",&q[i].op,&q[i].i,&q[i].x);
v.push_back(q[i].x);
} sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
int nn=v.size(); for(int i=;i<=n;i++){
int pos=lower_bound(v.begin(),v.end(),a[i])-v.begin()+;
update(,pos,,,nn,);
}
for(int i=;i<=m;i++){
int pos=lower_bound(v.begin(),v.end(),b[i])-v.begin()+;
update(,pos,-,,nn,);
} for(int i=;i<=Q;i++){
int op=q[i].op,p=q[i].i,x=q[i].x;
if(op==){//修改a的值
int pos=lower_bound(v.begin(),v.end(),a[p])-v.begin()+;
update(,pos,-,,nn,);
a[p]=x;
pos=lower_bound(v.begin(),v.end(),a[p])-v.begin()+;
update(,pos,,,nn,);
ans[i]=query(,nn,);
if(ans[i]>)
ans[i]=v[ans[i]-];
}
else {
int pos=lower_bound(v.begin(),v.end(),b[p])-v.begin()+;
update(,pos,,,nn,);
b[p]=x;
pos=lower_bound(v.begin(),v.end(),b[p])-v.begin()+;
update(,pos,-,,nn,);
ans[i]=query(,nn,);
if(ans[i]>)
ans[i]=v[ans[i]-];
}
}
for(int i=;i<=Q;i++)
cout<<ans[i]<<'\n';
}

最新文章

  1. 小明的密码-初级DP解法
  2. HTML基础篇之列表相关标签和特殊字符实体
  3. Asp.net有关访问页面权限的限制和错误页面配置
  4. Docker的学习--命令使用详解
  5. 菜鸟学Linux命令:lsof命令 查找指定用户、进程、端口打开的文件
  6. BZOJ-1207 打鼹鼠 DP(LIS)
  7. yoman安装和使用
  8. Tomcat下部署多个项目
  9. windows条件下,Ping加上时间戳,并保存到文件,适用于测试网络
  10. Java 关于 == 和 equal()的区别
  11. Nginx+Keepalived主备负载均衡
  12. js在本地预览图片
  13. linux的一点一滴---open
  14. Openjudge-计算概论(A)-找和为K的两个元素
  15. Self Numbers
  16. PHP学习笔记-2
  17. JAVA中LOCK
  18. C++primer第一章(部分)
  19. Can&#39;t read swagger JSON from http://localhost:8080/Test/api-docs
  20. 前缀和的应用 CodeForces - 932B Recursive Queries

热门文章

  1. spring的组成模块
  2. Deb版本Linux配置Selenium+Chrome+Java实现自动化测试
  3. 笔记52 Mybatis快速入门(三)
  4. BIO、NIO和AIO
  5. lib 和 dll 的区别、生成以及使用详解 ~~包含示例代码~~(转)
  6. vue之axios的使用
  7. 第一个gulp 项目
  8. spark运行任务报错:Container [...] is running beyond physical memory limits. Current usage: 3.0 GB of 3 GB physical memory used; 5.0 GB of 6.3 GB virtual memory used. Killing container.
  9. 解决 AUTH` failed: ERR Client sent AUTH, but no password is set [tcp://127.0.0.1:6379]
  10. 解析Tomcat之HttpServlet详解