Advertisement
pb_jiang

CF1791F AC lazy_segtree

Feb 4th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.29 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  5. template <typename... Args> void logger(string vars, Args &&... values)
  6. {
  7.     cerr << vars << " = ";
  8.     string delim = "";
  9.     (..., (cerr << delim << values, delim = ", "));
  10.     cerr << endl;
  11. }
  12.  
  13. namespace atcoder
  14. {
  15.  
  16. template <class S, S (*op)(S, S), S (*e)(), class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()>
  17. struct lazy_segtree {
  18.     int ceil_pow2(int n)
  19.     {
  20.         int x = 0;
  21.         while ((1U << x) < (unsigned int) (n))
  22.             x++;
  23.         return x;
  24.     }
  25.  
  26.   public:
  27.     lazy_segtree() : lazy_segtree(0) {}
  28.     explicit lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
  29.     explicit lazy_segtree(const std::vector<S> &v) : _n(int(v.size()))
  30.     {
  31.         log = ceil_pow2(_n);
  32.         size = 1 << log;
  33.         d = std::vector<S>(2 * size, e());
  34.         lz = std::vector<F>(size, id());
  35.         for (int i = 0; i < _n; i++)
  36.             d[size + i] = v[i];
  37.         for (int i = size - 1; i >= 1; i--) {
  38.             update(i);
  39.         }
  40.     }
  41.  
  42.     void set(int p, S x)
  43.     {
  44.         assert(0 <= p && p < _n);
  45.         p += size;
  46.         for (int i = log; i >= 1; i--)
  47.             push(p >> i);
  48.         d[p] = x;
  49.         for (int i = 1; i <= log; i++)
  50.             update(p >> i);
  51.     }
  52.  
  53.     S get(int p)
  54.     {
  55.         assert(0 <= p && p < _n);
  56.         p += size;
  57.         for (int i = log; i >= 1; i--)
  58.             push(p >> i);
  59.         return d[p];
  60.     }
  61.  
  62.     S prod(int l, int r)
  63.     {
  64.         assert(0 <= l && l <= r && r <= _n);
  65.         if (l == r)
  66.             return e();
  67.  
  68.         l += size;
  69.         r += size;
  70.  
  71.         for (int i = log; i >= 1; i--) {
  72.             if (((l >> i) << i) != l)
  73.                 push(l >> i);
  74.             if (((r >> i) << i) != r)
  75.                 push((r - 1) >> i);
  76.         }
  77.  
  78.         S sml = e(), smr = e();
  79.         while (l < r) {
  80.             if (l & 1)
  81.                 sml = op(sml, d[l++]);
  82.             if (r & 1)
  83.                 smr = op(d[--r], smr);
  84.             l >>= 1;
  85.             r >>= 1;
  86.         }
  87.  
  88.         return op(sml, smr);
  89.     }
  90.  
  91.     S all_prod() { return d[1]; }
  92.  
  93.     void apply(int p, F f)
  94.     {
  95.         assert(0 <= p && p < _n);
  96.         p += size;
  97.         for (int i = log; i >= 1; i--)
  98.             push(p >> i);
  99.         d[p] = mapping(f, d[p]);
  100.         for (int i = 1; i <= log; i++)
  101.             update(p >> i);
  102.     }
  103.     void apply(int l, int r, F f)
  104.     {
  105.         assert(0 <= l && l <= r && r <= _n);
  106.         if (l == r)
  107.             return;
  108.  
  109.         l += size;
  110.         r += size;
  111.  
  112.         for (int i = log; i >= 1; i--) {
  113.             if (((l >> i) << i) != l)
  114.                 push(l >> i);
  115.             if (((r >> i) << i) != r)
  116.                 push((r - 1) >> i);
  117.         }
  118.  
  119.         {
  120.             int l2 = l, r2 = r;
  121.             while (l < r) {
  122.                 if (l & 1)
  123.                     all_apply(l++, f);
  124.                 if (r & 1)
  125.                     all_apply(--r, f);
  126.                 l >>= 1;
  127.                 r >>= 1;
  128.             }
  129.             l = l2;
  130.             r = r2;
  131.         }
  132.  
  133.         for (int i = 1; i <= log; i++) {
  134.             if (((l >> i) << i) != l)
  135.                 update(l >> i);
  136.             if (((r >> i) << i) != r)
  137.                 update((r - 1) >> i);
  138.         }
  139.     }
  140.  
  141.     template <bool (*g)(S)> int max_right(int l)
  142.     {
  143.         return max_right(l, [](S x) { return g(x); });
  144.     }
  145.     template <class G> int max_right(int l, G g)
  146.     {
  147.         assert(0 <= l && l <= _n);
  148.         assert(g(e()));
  149.         if (l == _n)
  150.             return _n;
  151.         l += size;
  152.         for (int i = log; i >= 1; i--)
  153.             push(l >> i);
  154.         S sm = e();
  155.         do {
  156.             while (l % 2 == 0)
  157.                 l >>= 1;
  158.             if (!g(op(sm, d[l]))) {
  159.                 while (l < size) {
  160.                     push(l);
  161.                     l = (2 * l);
  162.                     if (g(op(sm, d[l]))) {
  163.                         sm = op(sm, d[l]);
  164.                         l++;
  165.                     }
  166.                 }
  167.                 return l - size;
  168.             }
  169.             sm = op(sm, d[l]);
  170.             l++;
  171.         } while ((l & -l) != l);
  172.         return _n;
  173.     }
  174.  
  175.     template <bool (*g)(S)> int min_left(int r)
  176.     {
  177.         return min_left(r, [](S x) { return g(x); });
  178.     }
  179.     template <class G> int min_left(int r, G g)
  180.     {
  181.         assert(0 <= r && r <= _n);
  182.         assert(g(e()));
  183.         if (r == 0)
  184.             return 0;
  185.         r += size;
  186.         for (int i = log; i >= 1; i--)
  187.             push((r - 1) >> i);
  188.         S sm = e();
  189.         do {
  190.             r--;
  191.             while (r > 1 && (r % 2))
  192.                 r >>= 1;
  193.             if (!g(op(d[r], sm))) {
  194.                 while (r < size) {
  195.                     push(r);
  196.                     r = (2 * r + 1);
  197.                     if (g(op(d[r], sm))) {
  198.                         sm = op(d[r], sm);
  199.                         r--;
  200.                     }
  201.                 }
  202.                 return r + 1 - size;
  203.             }
  204.             sm = op(d[r], sm);
  205.         } while ((r & -r) != r);
  206.         return 0;
  207.     }
  208.  
  209.   private:
  210.     int _n, size, log;
  211.     std::vector<S> d;
  212.     std::vector<F> lz;
  213.  
  214.     void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
  215.     void all_apply(int k, F f)
  216.     {
  217.         d[k] = mapping(f, d[k]);
  218.         if (k < size)
  219.             lz[k] = composition(f, lz[k]);
  220.     }
  221.     void push(int k)
  222.     {
  223.         all_apply(2 * k, lz[k]);
  224.         all_apply(2 * k + 1, lz[k]);
  225.         lz[k] = id();
  226.     }
  227. };
  228.  
  229. } // namespace atcoder
  230.  
  231. template <class T> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m)); }
  232. template <class T> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n)); }
  233. template <class T, T init> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m, init)); }
  234. template <class T, T init> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n, init)); }
  235.  
  236. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  237.  
  238. using ll = long long;
  239. using pii = pair<int, int>;
  240. using vl = vector<ll>;
  241. using vi = vector<int>;
  242.  
  243. using atcoder::lazy_segtree;
  244.  
  245. using S = ll;
  246. using F = ll;
  247. S op(S a, S b) { return max(a, b); }
  248. S e() { return 0; }
  249. S cut(S x)
  250. {
  251.     ll ret = 0;
  252.     while (x) {
  253.         ret += x % 10;
  254.         x /= 10;
  255.     }
  256.     return ret;
  257. }
  258. S mapping(F f, S r)
  259. {
  260.     if (r < 10)
  261.         return r;
  262.     while (f--) {
  263.         r = cut(r);
  264.         if (r < 10)
  265.             break;
  266.     }
  267.     return r;
  268. }
  269. F id() { return 0; }
  270. F composition(F f, F g) { return f + g; }
  271.  
  272. int main(int argc, char **argv)
  273. {
  274.     int t;
  275.     cin >> t;
  276.     while (t--) {
  277.         int n, q;
  278.         cin >> n >> q;
  279.         vl a(n);
  280.         for (auto &x : a)
  281.             cin >> x;
  282.         lazy_segtree<S, op, e, F, mapping, composition, id> seg(a);
  283.         ll op, l, r, x;
  284.         for (int i = 0; i < q; ++i) {
  285.             cin >> op;
  286.             if (op == 1) {
  287.                 cin >> l >> r;
  288.                 seg.apply(l - 1, r, 1);
  289.             } else {
  290.                 cin >> x;
  291.                 // cout << seg.get(x - 1) << endl;
  292.                 cout << seg.prod(x - 1, x) << endl;
  293.             }
  294.         }
  295.     }
  296.     return 0;
  297. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement