結果
| 問題 | No.3507 RangeSum RangeUpdate RangeSqrt |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-19 12:41:21 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 174 ms / 2,000 ms |
| コード長 | 2,299 bytes |
| 記録 | |
| コンパイル時間 | 2,316 ms |
| コンパイル使用メモリ | 336,464 KB |
| 実行使用メモリ | 12,324 KB |
| 最終ジャッジ日時 | 2026-04-19 12:41:36 |
| 合計ジャッジ時間 | 7,551 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 29 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1 << 17;
const ll NIL = -1;
ll sm[2*MAXN], mn[2*MAXN], mx[2*MAXN], lz[2*MAXN];
int N;
void apply(int v, int l, int r, ll val){
sm[v] = val*(r-l);
mn[v] = mx[v] = val;
lz[v] = val;
}
void push(int v, int l, int r){
if(lz[v] != NIL){
int m = (l+r)>>1;
apply(2*v, l, m, lz[v]);
apply(2*v+1, m, r, lz[v]);
lz[v] = NIL;
}
}
void pull(int v){
sm[v] = sm[2*v]+sm[2*v+1];
mn[v] = min(mn[2*v],mn[2*v+1]);
mx[v] = max(mx[2*v],mx[2*v+1]);
}
void build(int v, int l, int r, vector<ll>& A){
lz[v] = NIL;
if(l+1==r){
sm[v] = mn[v] = mx[v] = (l < (int)A.size() ? A[l] : 0);
return;
}
int m = (l+r)>>1;
build(2*v,l,m,A);
build(2*v+1,m,r,A);
pull(v);
}
ll qsum(int v, int l, int r, int ql, int qr){
if(ql<=l && r<=qr) return sm[v];
push(v,l,r);
int m=(l+r)>>1; ll res=0;
if(ql<m) res+=qsum(2*v,l,m,ql,qr);
if(qr>m) res+=qsum(2*v+1,m,r,ql,qr);
return res;
}
void uassign(int v, int l, int r, int ql, int qr, ll val){
if(ql<=l && r<=qr){ apply(v,l,r,val); return; }
push(v,l,r);
int m=(l+r)>>1;
if(ql<m) uassign(2*v,l,m,ql,qr,val);
if(qr>m) uassign(2*v+1,m,r,ql,qr,val);
pull(v);
}
inline ll isq(ll x){
ll s = sqrtl(x);
while(s*s > x) s--;
while((s+1)*(s+1) <= x) s++;
return s;
}
void uisqrt(int v, int l, int r, int ql, int qr){
if(ql>=r || l>=qr) return;
ll a = isq(mn[v]), b = isq(mx[v]);
if(ql<=l && r<=qr && a==b){ apply(v,l,r,a); return; }
if(l+1==r){ sm[v]=mn[v]=mx[v]=a; lz[v]=NIL; return; }
push(v,l,r);
int m=(l+r)>>1;
uisqrt(2*v,l,m,ql,qr);
uisqrt(2*v+1,m,r,ql,qr);
pull(v);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<ll> A(n);
for(auto& a : A) cin >> a;
N = MAXN;
build(1, 0, N, A);
while(q--){
int t; cin >> t;
if(t==0){
int l,r; cin>>l>>r;
cout << qsum(1,0,N,l,r) << '\n';
} else if(t==1){
int l,r; ll x; cin>>l>>r>>x;
uassign(1,0,N,l,r,x);
} else {
int l,r; cin>>l>>r;
uisqrt(1,0,N,l,r);
}
}
}