Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- // tiom4eg's precompiler options
- // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
- // IO settings
- #define fastIO ios_base::sync_with_stdio(false); cin.tie(0)
- // Quick types
- #define ll long long
- #define ld long double
- #define ull unsigned long long
- #define pii pair <int, int>
- #define pll pair <ll, ll>
- #define vi vector <int>
- #define mi vector <vector <int> >
- // Quick functions
- #define endl "\n"
- #define F first
- #define S second
- #define all(a) a.begin(), a.end()
- #define pb push_back
- #define mp make_pair
- #define fint(n) int n; cin >> n
- #define fstr(s) string s; cin >> s
- #define farr(a, n) int a[n]; for (int pog = 0; pog < n; ++pog) cin >> a[pog]
- #define min(a, b) ((a < b) ? (a) : (b))
- #define max(a, b) ((a > b) ? (a) : (b))
- // Quick fors
- #define FOR1(s, n) for (int i = s; i < n; ++i)
- #define FOR2(s, n) for (int j = s; j < n; ++j)
- #define FOR3(s, n) for (int k = s; k < n; ++k)
- #define RFOR(n, s) for (int l = n; l >= s; --l)
- // Pragmas
- #pragma GCC optimize("Ofast") // let the chaos begin!
- #pragma GCC optimize ("unroll-loops")
- #pragma target("avx,fma")
- #pragma comment(linker, "/stack:200000000")
- #pragma target("tune=native")
- // PBDS
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #define ordered_set tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>
- #define ook order_of_key
- #define fbo find_by_order
- // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
- using namespace std;
- using namespace __gnu_pbds;
- mt19937 rng(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
- const int R = 1 << 18;
- int a[2 * R];
- void build() { for (int i = R - 1; i >= 1; --i) a[i] = max(a[2 * i], a[2 * i + 1]); }
- int get(int ql, int val, int node = 1, int nl = 0, int nr = R) {
- if (ql >= nr || a[node] < val) return -1;
- if (nl + 1 == nr && a[R + nl] >= val) return nl;
- int nm = (nl + nr) / 2;
- int lres = get(ql, val, 2 * node, nl, nm);
- if (lres >= 0) return lres;
- else return get(ql, val, 2 * node + 1, nm, nr);
- }
- int main() {
- fastIO;
- string s; cin >> s;
- int n = s.size();
- int k; cin >> k;
- FOR1(0, n) a[R + i] = s[i] - '0';
- build();
- string t;
- int pos = 0;
- while (pos < n) {
- int b = get(pos + 1, s[pos] - '0' + 1);
- if (b == -1 || b - pos > k) {
- t += s[pos];
- pos++;
- }
- else k -= (b - pos), pos = b;
- }
- int m = t.size();
- FOR1(0, m - k) cout << t[i];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement