社区讨论
10pts 求调
P3834【模板】可持久化线段树 2参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m4pe3lhd
- 此快照首次捕获于
- 2024/12/15 17:14 去年
- 此快照最后确认于
- 2025/11/04 12:47 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int ls,rs,l,r,num;
}tr[5000105];
int n,m;
int a[200005],v[200005],cnt,f,tot,root[200005];
map<int,int> mp;
void build(int p,int l,int r){
tr[p].l = l,tr[p].r = r;
if(l == r) return ;
int mid = (l + r) / 2;
tr[p].ls = ++tot;
build(tot,l,mid);
tr[p].rs = ++tot;
build(tot,mid + 1,r);
return ;
}
void change(int p,int f,int k,int d){
if(tr[d].l == tr[d].r){
tr[d].num += k;
return ;
}
int mid = (tr[p].l + tr[p].r) / 2;
if(f <= mid){
tr[d].ls = ++tot;
tr[tot] = tr[tr[p].ls];
change(tr[p].ls,f,k,tot);
tr[d].num = tr[tr[d].ls].num + tr[tr[d].rs].num;
}
else{
tr[d].rs = ++tot;
tr[tot] = tr[tr[p].rs];
change(tr[p].rs,f,k,tot);
tr[d].num = tr[tr[d].ls].num + tr[tr[d].rs].num;
}
return ;
}
void found(int p,int d,int k){
if(tr[p].l == tr[p].r){
printf("%lld\n",v[tr[p].l]);
return ;
}
int f = tr[tr[d].ls].num - tr[tr[p].ls].num;
if(k <= f) found(tr[p].ls,tr[d].ls,k);
else found(tr[p].rs,tr[d].rs,k);
return ;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n;i++) scanf("%lld",&a[i]);
//sort(a + 1,a + n + 1,cmp);
a[0] = -1;
for(int i = 1;i <= n;i++) if(a[i] != a[i - 1]) f++;
build(0,1,f);
for(int i = 1;i <= n;i++){
if(!mp[a[i]]) mp[a[i]] = ++cnt,v[cnt] = a[i];
root[i] = ++tot;
tr[tot] = tr[root[i - 1]];
change(root[i - 1],mp[a[i]],1,tot);
}
int l,r,k;
for(int i = 1;i <= m;i++){
scanf("%lld%lld%lld",&l,&r,&k);
found(root[l - 1],root[r],k);
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...