Advertisement
tiom4eg

E with SegTree

Dec 19th, 2021
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. // tiom4eg's precompiler options
  3. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  4. // IO settings
  5. #define fastIO ios_base::sync_with_stdio(false); cin.tie(0)
  6. // Quick types
  7. #define ll long long
  8. #define ld long double
  9. #define ull unsigned long long
  10. #define pii pair <int, int>
  11. #define pll pair <ll, ll>
  12. #define vi vector <int>
  13. #define mi vector <vector <int> >
  14. // Quick functions
  15. #define endl "\n"
  16. #define F first
  17. #define S second
  18. #define all(a) a.begin(), a.end()
  19. #define pb push_back
  20. #define mp make_pair
  21. #define fint(n) int n; cin >> n
  22. #define fstr(s) string s; cin >> s
  23. #define farr(a, n) int a[n]; for (int pog = 0; pog < n; ++pog) cin >> a[pog]
  24. #define min(a, b) ((a < b) ? (a) : (b))
  25. #define max(a, b) ((a > b) ? (a) : (b))
  26. // Quick fors
  27. #define FOR1(s, n) for (int i = s; i < n; ++i)
  28. #define FOR2(s, n) for (int j = s; j < n; ++j)
  29. #define FOR3(s, n) for (int k = s; k < n; ++k)
  30. #define RFOR(n, s) for (int l = n; l >= s; --l)
  31. // Pragmas
  32. #pragma GCC optimize("Ofast") // let the chaos begin!
  33. #pragma GCC optimize ("unroll-loops")
  34. #pragma target("avx,fma")
  35. #pragma comment(linker, "/stack:200000000")
  36. #pragma target("tune=native")
  37. // PBDS
  38. #include <ext/pb_ds/assoc_container.hpp>
  39. #include <ext/pb_ds/tree_policy.hpp>
  40. #define ordered_set tree <int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>
  41. #define ook order_of_key
  42. #define fbo find_by_order
  43. // POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS POGGERS
  44. using namespace std;
  45. using namespace __gnu_pbds;
  46. mt19937 rng(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
  47.  
  48. const int R = 1 << 18;
  49. int a[2 * R];
  50.  
  51. void build() { for (int i = R - 1; i >= 1; --i) a[i] = max(a[2 * i], a[2 * i + 1]); }
  52.  
  53. int get(int ql, int val, int node = 1, int nl = 0, int nr = R) {
  54.     if (ql >= nr || a[node] < val) return -1;
  55.     if (nl + 1 == nr && a[R + nl] >= val) return nl;
  56.     int nm = (nl + nr) / 2;
  57.     int lres = get(ql, val, 2 * node, nl, nm);
  58.     if (lres >= 0) return lres;
  59.     else return get(ql, val, 2 * node + 1, nm, nr);
  60. }
  61.  
  62. int main() {
  63.     fastIO;
  64.     string s; cin >> s;
  65.     int n = s.size();
  66.     int k; cin >> k;
  67.     FOR1(0, n) a[R + i] = s[i] - '0';
  68.     build();
  69.     string t;
  70.     int pos = 0;
  71.     while (pos < n) {
  72.         int b = get(pos + 1, s[pos] - '0' + 1);
  73.         if (b == -1 || b - pos > k) {
  74.             t += s[pos];
  75.             pos++;
  76.         }
  77.         else k -= (b - pos), pos = b;
  78.     }
  79.     int m = t.size();
  80.     FOR1(0, m - k) cout << t[i];
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement