func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   struct Seg {     const T ID = 0;     T comb(T a, T b) { return a + b; }     long long n;     vector<T> seg;     void init(long long _n) {       n = _n;       seg.assign(2 * n, ID);     }     void pull(long long p) { seg[p] = comb(seg[2 * p], seg[2 * p + 1]); }     void upd(long long p, T val) {       seg[p += n] = val;       for (p /= 2; p; p /= 2) pull(p);     }     T query(long long l, long long r) {       T ra = ID, rb = ID;       for (l += n, r += n + 1; l < r; l /= 2, r /= 2) {         if (l & 1) ra = comb(ra, seg[l++]);         if (r & 1) rb = comb(seg[--r], rb);       }       return comb(ra, rb);     }   };   signed main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     long long m;     cin >> m;     string s;     cin >> s;     long long n = s.size();     long long a[n];     for (long long i = 0; i < n; ++i) {       a[i] = s[i] -  a ;     }     vector<long long> ans;     set<array<long long, 2>> ranges;     Seg<long long> st;     st.init(n);     for (long long i = 0; i < n; ++i) {       if (i + m - 1 >= n) break;       ranges.insert({i, i + m - 1});     }     for (long long i = 0; i < 26; ++i) {       bool fin = 1;       for (long long j = 0; j < n; ++j) {         if (a[j] == i) {           st.upd(j, 1);         }       }       for (auto [l, r] : ranges) {         fin &= st.query(l, r) > 0;       }       if (fin) {         vector<long long> pos;         for (long long j = 0; j < n; ++j) {           if (a[j] == i) {             st.upd(j, 0);             pos.push_back(j);           }         }         for (auto [l, r] : ranges) {           if (st.query(l, r)) continue;           auto lb = --(lower_bound((pos).begin(), (pos).end(), r + 1));           st.upd(*lb, 1);           ans.push_back(i);         }         break;       } else {         for (long long j = 0; j < n; ++j) {           if (a[j] == i) {             ans.push_back(i);           }         }         vector<array<long long, 2>> rem;         for (auto [l, r] : ranges) {           if (st.query(l, r)) {             rem.push_back({l, r});           }         }         for (auto [l, r] : rem) {           ranges.erase({l, r});         }       }     }     for (long long i : ans) {       cout << (char)(i +  a );     }     cout <<   n ;   }   