题解:P17738 [ICPC 2019 Xuzhou R] Yuuki and a problem
很暴力的解法。为啥我想了这么久(我不到啊讨论区里说 3log 能过我就来了。)
查询操作里,维护这个
这里发现,
所以
最后的话。要维护单点修改和二维数点。直接暴力二维树状数组即可。时间复杂度
https://www.luogu.com.cn/record/304963053
::::info[Code]
#include<bits/stdc++.h>
using namespace std;
template <typename _Tp> inline void read(_Tp&x){
char ch;
bool f=0;
x=0;
while(ch=getchar(),!isdigit(ch)) if(ch=='-')f=1;
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
template <typename _Tp> inline void print(_Tp x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9) print(x/10);
putchar(x%10+'0');
}
#define ll long long
const int N=200010;
int n,m,a[N],q1[N],q2[N],q3[N];
vector<int> val[N];
vector<ll> tr[N];
inline void add(int x,int v,int f){
for(;x<=n;x+=x&-x){
int j=lower_bound(val[x].begin(),val[x].end(),v)-val[x].begin()+1;
for(;j<tr[x].size();j+=j&-j) tr[x][j]+=1ll*v*f;
}
}
inline ll query(int x,ll y){
ll s=0;
for(;x;x-=x&-x){
int j=upper_bound(val[x].begin(),val[x].end(),y)-val[x].begin();
for(;j;j-=j&-j) s+=tr[x][j];
}
return s;
}
signed main(){
read(n),read(m);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=m;i++){
read(q1[i]),read(q2[i]),read(q3[i]);
if(q1[i]==1){for(int j=q2[i];j<=n;j+=j&-j) val[j].push_back(q3[i]);}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=j&-j) val[j].push_back(a[i]);
sort(val[i].begin(),val[i].end());
val[i].erase(unique(val[i].begin(),val[i].end()),val[i].end());
tr[i].assign(val[i].size()+1,0);
}
for(int i=1;i<=n;i++) add(i,a[i],1);
for(int i=1;i<=m;i++){
if(q1[i]==1) add(q2[i],a[q2[i]],-1),a[q2[i]]=q3[i],add(q2[i],q3[i],1);
else{
ll ans=1,s=query(q3[i],1)-query(q2[i]-1,1);
while(s>=ans) ans=s+1,s=query(q3[i],ans)-query(q2[i]-1,ans);
print(ans),putchar('\n');
}
}
return 0;
}
::::