結果

問題 No.3506 All Distance is Square Number
コンテスト
ユーザー はじっこゆーれー
提出日時 2026-04-18 06:37:16
言語 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  
実行時間 -
コード長 3,373 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,371 ms
コンパイル使用メモリ 192,536 KB
実行使用メモリ 7,976 KB
最終ジャッジ日時 2026-04-18 06:37:19
合計ジャッジ時間 2,779 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other WA * 29
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
struct Node {
    long long sum;
    long long max_v;
    long long min_v;
    long long lazy;
};
vector<Node> tree;
long long integer_sqrt(long long x) {
    long long res = sqrt(x);
    while ((res + 1) * (res + 1) <= x) res++;
    while (res * res > x) res--;
    return res;
}
void apply_assign(int node, int l, int r, long long x) {
    tree[node].sum = x * (r - l);
    tree[node].max_v = x;
    tree[node].min_v = x;
    tree[node].lazy = x;
}
void push(int node, int l, int r) {
    if (tree[node].lazy != -1) {
        int mid = l + (r - l) / 2;
        apply_assign(node * 2, l, mid, tree[node].lazy);
        apply_assign(node * 2 + 1, mid, r, tree[node].lazy);
        tree[node].lazy = -1;
    }
}
void pull(int node) {
    tree[node].sum = tree[node * 2].sum + tree[node * 2 + 1].sum;
    tree[node].max_v = max(tree[node * 2].max_v, tree[node * 2 + 1].max_v);
    tree[node].min_v = min(tree[node * 2].min_v, tree[node * 2 + 1].min_v);
}
void build(int node, int l, int r, const vector<long long>& A) {
    tree[node].lazy = -1;
    if (l + 1 == r) {
        tree[node].sum = A[l];
        tree[node].max_v = A[l];
        tree[node].min_v = A[l];
        return;
    }
    int mid = l + (r - l) / 2;
    build(node * 2, l, mid, A);
    build(node * 2 + 1, mid, r, A);
    pull(node);
}
void update_assign(int node, int l, int r, int ql, int qr, long long x) {
    if (ql >= r || qr <= l) return;
    if (ql <= l && r <= qr) {
        apply_assign(node, l, r, x);
        return;
    }
    push(node, l, r);
    int mid = l + (r - l) / 2;
    update_assign(node * 2, l, mid, ql, qr, x);
    update_assign(node * 2 + 1, mid, r, ql, qr, x);
    pull(node);
}
void update_sqrt(int node, int l, int r, int ql, int qr) {
    if (ql >= r || qr <= l) return;
    if (ql <= l && r <= qr) {
        if (tree[node].max_v == tree[node].min_v) {
            long long v = integer_sqrt(tree[node].max_v);
            apply_assign(node, l, r, v);
            return;
        }
    }
    push(node, l, r);
    int mid = l + (r - l) / 2;
    update_sqrt(node * 2, l, mid, ql, qr);
    update_sqrt(node * 2 + 1, mid, r, ql, qr);
    pull(node);
}
long long query_sum(int node, int l, int r, int ql, int qr) {
    if (ql >= r || qr <= l) return 0;
    if (ql <= l && r <= qr) return tree[node].sum;
    push(node, l, r);
    int mid = l + (r - l) / 2;
    return query_sum(node * 2, l, mid, ql, qr) + query_sum(node * 2 + 1, mid, r, ql, qr);
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int N, Q;
    if (!(cin >> N >> Q)) return 0;
    vector<long long> A(N);
    for (int i = 0; i < N; ++i) {
        cin >> A[i];
    }
    tree.resize(4 * N);
    build(1, 0, N, A);
    for (int i = 0; i < Q; ++i) {
        int type;
        cin >> type;
        if (type == 0) {
            int l, r;
            cin >> l >> r;
            if (l == r) cout << 0 << "\n";
            else cout << query_sum(1, 0, N, l, r) << "\n";
        } else if (type == 1) {
            int l, r;
            long long x;
            cin >> l >> r >> x;
            if (l < r) update_assign(1, 0, N, l, r, x);
        } else if (type == 2) {
            int l, r;
            cin >> l >> r;
            if (l < r) update_sqrt(1, 0, N, l, r);
        }
    }
    return 0;
}
0