結果
| 問題 | No.3507 RangeSum RangeUpdate RangeSqrt |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-22 09:23:57 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 7,490 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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);
}
}
}