結果

問題 No.3507 RangeSum RangeUpdate RangeSqrt
コンテスト
ユーザー Kurao
提出日時 2026-04-22 09:23:57
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 7,490 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,651 ms
コンパイル使用メモリ 218,640 KB
実行使用メモリ 13,952 KB
最終ジャッジ日時 2026-04-22 09:24:10
合計ジャッジ時間 10,669 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 1 WA * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<iostream>
#include<vector>
#include<array>
#include<queue>
#include<cmath>

using namespace std;
#define overload4(_1,_2,_3,_4,name,...) name

#define rep1(i,n) for (int i = 0; i < (n); ++i)
#define rep2(i,m,n) for (int i = (m); i < (n); ++i)
#define rep3(i,m,n,k) for (int i = (m); i < (n); i += (k))

#define rep(...) overload4(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)

#define inf 1000000000

vector<pair<int,int>> dij = {{0,1}, {1,0}, {0,-1}, {-1,0}};

//using mint = modint998244353;

#include <algorithm>
#include <cassert>
#include <functional>
#include <vector>

unsigned int bit_ceil(unsigned int n) {
    unsigned int x = 1;
    while (x < (unsigned int)(n)) x *= 2;
    return x;
}

int countr_zero(unsigned int n) {
#ifdef _MSC_VER
    unsigned long index;
    _BitScanForward(&index, n);
    return index;
#else
    return __builtin_ctz(n);
#endif
}

template <class S,
          S (*op)(S, S),
          S (*e)(),
          class F,
          S (*mapping)(F, S),
          F (*composition)(F, F),
          F (*id)()>
struct lazy_segtree {
  public:
    lazy_segtree() : lazy_segtree(0) {}
    explicit lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
    explicit lazy_segtree(const std::vector<S>& v) : _n(int(v.size())) {
        size = (int)bit_ceil((unsigned int)(_n));
        log = countr_zero((unsigned int)size);
        d = std::vector<S>(2 * size, e());
        lz = std::vector<F>(size, id());
        for (int i = 0; i < _n; i++) d[size + i] = v[i];
        for (int i = size - 1; i >= 1; i--) {
            update(i);
        }
    }

    void set(int p, S x) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        d[p] = x;
        for (int i = 1; i <= log; i++) update(p >> i);
    }

    S get(int p) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        return d[p];
    }

    S prod(int l, int r) {
        assert(0 <= l && l <= r && r <= _n);
        if (l == r) return e();

        l += size;
        r += size;

        for (int i = log; i >= 1; i--) {
            if (((l >> i) << i) != l) push(l >> i);
            if (((r >> i) << i) != r) push((r - 1) >> i);
        }

        S sml = e(), smr = e();
        while (l < r) {
            if (l & 1) sml = op(sml, d[l++]);
            if (r & 1) smr = op(d[--r], smr);
            l >>= 1;
            r >>= 1;
        }

        return op(sml, smr);
    }

    S all_prod() { return d[1]; }

    void apply(int p, F f) {
        assert(0 <= p && p < _n);
        p += size;
        for (int i = log; i >= 1; i--) push(p >> i);
        d[p] = mapping(f, d[p]);
        for (int i = 1; i <= log; i++) update(p >> i);
    }
    void apply(int l, int r, F f) {
        assert(0 <= l && l <= r && r <= _n);
        if (l == r) return;

        l += size;
        r += size;

        for (int i = log; i >= 1; i--) {
            if (((l >> i) << i) != l) push(l >> i);
            if (((r >> i) << i) != r) push((r - 1) >> i);
        }

        {
            int l2 = l, r2 = r;
            while (l < r) {
                if (l & 1) all_apply(l++, f);
                if (r & 1) all_apply(--r, f);
                l >>= 1;
                r >>= 1;
            }
            l = l2;
            r = r2;
        }

        for (int i = 1; i <= log; i++) {
            if (((l >> i) << i) != l) update(l >> i);
            if (((r >> i) << i) != r) update((r - 1) >> i);
        }
    }

    template <bool (*g)(S)> int max_right(int l) {
        return max_right(l, [](S x) { return g(x); });
    }
    template <class G> int max_right(int l, G g) {
        assert(0 <= l && l <= _n);
        assert(g(e()));
        if (l == _n) return _n;
        l += size;
        for (int i = log; i >= 1; i--) push(l >> i);
        S sm = e();
        do {
            while (l % 2 == 0) l >>= 1;
            if (!g(op(sm, d[l]))) {
                while (l < size) {
                    push(l);
                    l = (2 * l);
                    if (g(op(sm, d[l]))) {
                        sm = op(sm, d[l]);
                        l++;
                    }
                }
                return l - size;
            }
            sm = op(sm, d[l]);
            l++;
        } while ((l & -l) != l);
        return _n;
    }

    template <bool (*g)(S)> int min_left(int r) {
        return min_left(r, [](S x) { return g(x); });
    }
    template <class G> int min_left(int r, G g) {
        assert(0 <= r && r <= _n);
        assert(g(e()));
        if (r == 0) return 0;
        r += size;
        for (int i = log; i >= 1; i--) push((r - 1) >> i);
        S sm = e();
        do {
            r--;
            while (r > 1 && (r % 2)) r >>= 1;
            if (!g(op(d[r], sm))) {
                while (r < size) {
                    push(r);
                    r = (2 * r + 1);
                    if (g(op(d[r], sm))) {
                        sm = op(d[r], sm);
                        r--;
                    }
                }
                return r + 1 - size;
            }
            sm = op(d[r], sm);
        } while ((r & -r) != r);
        return 0;
    }

  private:
    int _n, size, log;
    std::vector<S> d;
    std::vector<F> lz;

    void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
    void all_apply(int k, F f) {
        d[k] = mapping(f, d[k]);
        if (k < size) lz[k] = composition(f, lz[k]);
    }
    void push(int k) {
        all_apply(2 * k, lz[k]);
        all_apply(2 * k + 1, lz[k]);
        lz[k] = id();
    }
};
int isqrt(int n){
    double x=sqrt(n);
    int ans=(int)x;
    while ((ans+1)*(ans+1)<=n){
        ans++;
    }
    return ans;
};
struct S{
    int cnt_0;
    int cnt_1;
    array<int,5> fi;
};

S op(S x,S y){
    array<int,5> ans;
    rep (i,5){
        ans[i]=x.fi[i]+y.fi[i];
    }
    return S{x.cnt_0+y.cnt_0,x.cnt_1+y.cnt_1,ans};
};

S conv(int x){
    if (x==0){
        return S{1,0,{0,0,0,0,0}};
    } else {
        array<int,5> ans;
        ans[0]=x;
        rep(i,1,5){
            ans[i]=isqrt(ans[i-1]);
        }
        return S{1,1,ans};
    }
};

S rot(S x){
    array<int,5> ans;
    rep(i,4){
        ans[i]=x.fi[i+1];
    }
    ans[4]=x.cnt_1;
    return S{x.cnt_0,x.cnt_1,ans};
};

S mapping(int f,S x){
    if (f==-inf){
        return x;
    } else if (f<0) {
        S now=x;
        rep (i,-f){
            now=rot(now);
        }
        return now;
    } else {
        S ans=conv(f);
        array<int,5> final;
        rep(i,5){
            final[i]=ans.fi[i]*x.cnt_0;
        }
        return S{ans.cnt_0*x.cnt_0,ans.cnt_1*x.cnt_0,final};
    }
};

int composition(int f,int g){
    if (f==-inf){
        return g;
    } else if (g==-inf){
        return f;
    } else if (f>=0){
        return f;
    } else if (g>=0){
        return mapping(f,conv(g)).fi[0];
    } else {
        return f+g;
    }
};

S e(){
    return S{0,0,{0,0,0,0,0}};
}

int id(){
    return -inf;
};

int main(){
    int n,q;
    cin>>n>>q;
    vector<S> a(n);
    rep(_,n){
        int i;
        cin>>i;
        a[_]=conv(i);
    }
    lazy_segtree<S,op,e,int,mapping,composition,id> seg(a);
    rep(_,q){
        int t,l,r;
        cin>>t>>l>>r;
        if (t==0){
            cout<<seg.prod(l,r).fi[0]<<endl;
        } else if (t==1){
            int x;
            cin>>x;
            seg.apply(l,r,x);
        } else {
            seg.apply(l,r,-1);
        }
    }
}
0