雨中人
题意
有一个长度为
对于每个询问,给出一个值
对于每个修改,将位置
思路
考虑性质分析。如果存在两个位置使得后面比前面高,设前面的高
如图,这是样例的模拟。对于每个上升段,如果高度没有超过前一个,那么这两块肯定会连着,那么答案肯定不会更新,当且仅当高度在
#include<bits/stdc++.h>
using namespace std;
#define L(i,l,r) for(int i=l;i<=r;++i)
#define R(i,l,r) for(int i=r;i>=l;--i)
const int N=200010;
int n,m,a[N],lsh[N+N],val[N],id[N],len,c[N+N];
void add(int x,int v){
for(;x<=len;x+=x&-x)c[x]+=v;
}
int sum(int x){
int res=0;
for(;x;x-=x&-x)res+=c[x];
return res;
}
void update(int l,int r,int v){
add(l,v),add(r+1,-v);
}
void updata(int pos,int value,bool flag,int v){
if(a[pos-1]<a[pos])update(a[pos-1]+1,a[pos],v);
if(flag&&a[pos]<a[pos+1])update(a[pos]+1,a[pos+1],v);
}
int main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
scanf("%d%d",&n,&m);
L(i, 1, n)scanf("%d",a+i),lsh[i]=a[i];
L(i, 1, m){
int op;
scanf("%d",&op);
if(op==1){
int c;
scanf("%d",&c);
lsh[n+i]=c;
val[i]=c;
id[i]=-1;
}
else{
int x,y;
scanf("%d%d",&x,&y);
id[i]=x,val[i]=y;
lsh[n+i]=y;
}
}
sort(lsh+1,lsh+1+n+m);
len=unique(lsh+1,lsh+1+n+m)-lsh-1;
L(i, 1, n){
a[i]=lower_bound(lsh+1,lsh+1+len,a[i])-lsh;
updata(i,a[i],0,1);
}
L(i, 1, m){
val[i]=lower_bound(lsh+1,lsh+1+len,val[i])-lsh;
if(id[i]!=-1){
updata(id[i],a[id[i]],1,-1);
a[id[i]]=val[i];
updata(id[i], a[id[i]], 1, 1);
}
else{
printf("%d\n",sum(val[i]));
}
}
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17255650.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步