社区讨论
80份求条
P3834【模板】可持久化线段树 2参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m4h4cqwx
- 此快照首次捕获于
- 2024/12/09 22:19 去年
- 此快照最后确认于
- 2025/11/04 13:04 4 个月前
CPP
#include<bits/stdc++.h>
#define MAXN 100507
using namespace std;
int tot,n,m,sum[MAXN<<5],rt[MAXN<<5],rs[MAXN<<5],ls[MAXN<<5],a[MAXN+105],ind[MAXN+105],len;
inline int getid(register const int &x){
return lower_bound(ind+1,ind+len+1,x)-ind;
}
inline int build(register const int &l,register const int &r){
int root=++tot;
if(l==r) return root;
register int mid=(l+r)>>1;
rt[root]=build(l,mid);
rs[root]=build(mid+1,r);
return root;
}
inline int update(register const int &k,register const int &l,register const int &r,register const int &root) {
register int dir = ++tot;
ls[dir] = ls[root], rs[dir] = rs[root], sum[dir] = sum[root] + 1;
if (l == r) return dir;
register int mid =(l+r)>>1;
if (k <= mid) ls[dir] = update(k, l, mid, ls[dir]);
else rs[dir] = update(k, mid + 1, r, rs[dir]);
return dir;
}
inline int query(register const int &u,register const int &v,register const int &l,register const int &r,register const int &k) {
register int mid = l + r >> 1,
x = sum[ls[v]] - sum[ls[u]];
if (l == r) return l;
if (k <= x) return query(ls[u], ls[v], l, mid, k);
else return query(rs[u], rs[v], mid + 1, r, k - x);
}
int main(){
ios::sync_with_stdio(false),cin.tie(0);
cin>>n>>m;
for(register int i(1);i<=n;i=-~i){
cin>>a[i];
}
memcpy(ind, a, sizeof ind);
sort(ind + 1, ind + n + 1);
len = unique(ind + 1, ind + n + 1) - ind - 1;
rt[0] = build(1, len);
for (register int i(1);i<=n;i=-~i) rt[i] = update(getid(a[i]), 1, len, rt[i - 1]);
while (m--){
register int l,r,k;
cin>>l>>r>>k;
cout<<ind[query(rt[l-1], rt[r], 1, len, k)]<<'\n';
}
}
为什么是80分
回复
共 1 条回复,欢迎继续交流。
正在加载回复...