- #include<cstdio>
- #include<string>
- #include<iostream>
- #include<algorithm>
- #define si(n) scanf("%d",&n)
- #define dsi(n) int n;si(n)
- using namespace std;
- string str;
- class ch
- {
- public:
- char p;
- int index;
- ch():p(0),index(0){};
- friend bool operator <(const ch&a,const ch&b){return a.p==b.p?a.index>b.index:a.p<b.p;}
- };
- template<size_t N>
- class SegmentTree
- {
- //模板:线段树//
- public:
- ch tree[N];
- #define cm int m=(l+r)>>1
- #define lp p<<1
- #define rp p<<1|1
- #define lc lp,l,m
- #define rc rp,m+1,r
- #define stdp int p,int l,int r
- ch build(stdp)
- {
- if(l==r)
- {
- tree[p].p=str[l-1];
- tree[p].index=l;
- return tree[p];
- }
- cm;
- return tree[p]=max(build(lc),build(rc));
- }
- ch query(int L,int R,stdp)
- {
- if(L<=l&&r<=R) return tree[p];
- ch ret;
- ret.p=0;
- cm;
- if(L<=m)ret=max(query(L,R,lc),ret);
- if(R>m)ret=max(query(L,R,rc),ret);
- return ret;
- }
- };
- SegmentTree<20000> st;
- int n;
-
- int main()
- {
- cin>>str;
- int n=str.size();
- st.build(1,1,n);
- dsi(k);
- k=n-k;//fixed//
- string a;
- int lastIndex=0;
- for(int i=0;i<k;++i)
- {
- ch ret=st.query(lastIndex+1,n-k+i+1,1,1,n);
- cout<<ret.p;
- lastIndex=ret.index;
- }
- cout<<a;
- }
-