結果
| 問題 | 
                            No.877 Range ReLU Query
                             | 
                    
| コンテスト | |
| ユーザー | 
                             toyama
                         | 
                    
| 提出日時 | 2019-09-06 23:19:32 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                MLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,713 bytes | 
| コンパイル時間 | 1,143 ms | 
| コンパイル使用メモリ | 96,480 KB | 
| 実行使用メモリ | 814,464 KB | 
| 最終ジャッジ日時 | 2024-06-24 21:17:29 | 
| 合計ジャッジ時間 | 4,614 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | MLE * 1 | 
| other | -- * 20 | 
ソースコード
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <functional>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
template<class T, class Compare = less<T> >
using MaxHeap = priority_queue<T, vector<T>, Compare>;
template<class T, class Compare = greater<T> >
using MinHeap = priority_queue<T, vector<T>, Compare>;
using llong = long long;
llong n, q;
llong x;
vector<vector<llong> >seg;
vector<vector<llong> >sum;
void init(llong &n) {
    llong _n = 1;
    while (_n < n) _n *= 2;
    n = _n;
    seg.assign(2 * n, vector<llong>(1, 0));
    sum.assign(2 * n, vector<llong>(1, 0));
    for (int i = n - 2; i >= 0; i--) {
        seg[i].resize(seg[2 * i + 1].size() + seg[2 * i + 2].size());
        sum[i].assign(sum[2 * i + 1].size() + sum[2 * i + 2].size(), 0);
    }
    return;
};
void setv(llong k, llong v) {
    k += n - 1;
    seg[k][0] = v;
};
void build() {
    for (int i = n - 2; i >= 0; i--) {
        auto &l = seg[i * 2 + 1];
        auto &r = seg[i * 2 + 2];
        int l_i = 0;
        int r_i = 0;
        for (int j = 0; j < seg[i].size(); j++) {
            if (l_i >= l.size()) seg[i][j] = r[r_i++];
            if (r_i >= r.size()) seg[i][j] = l[l_i++];
            if (l[l_i] < r[r_i]) seg[i][j] = l[l_i++];
            else seg[i][j] = r[r_i++];
        }
        sum[i][0] = seg[i][0];
        for (int j = 1; j < sum[i].size(); j++) {
            sum[i][j] = sum[i][j - 1] + seg[i][j];
        }
    }
}
pair<llong, llong> acc(llong k, llong l, llong r) {
    llong idx = upper_bound(seg[k].begin(), seg[k].end(), x) - seg[k].begin();
    if (idx >= 1) {
        return make_pair(sum[k].back() - sum[k][idx - 1], sum[k].size() - idx);
    }
    else {
        return make_pair(sum[k].back(), sum[k].size());
    }
};
pair<llong, llong> query(llong l, llong r, llong k, llong a, llong b) {
    if (b < l || r < a) return make_pair(0, 0);
    if (l < a && b < r) {
        return acc(k, a, b);
    }
    else {
        pair<llong, llong> v1 = query(l, r, 2 * k + 1, a, (a + b) / 2);
        pair<llong, llong> v2 = query(l, r, 2 * k + 2, (a + b) / 2, b);
        return make_pair(v1.first + v2.first, v1.second + v2.second);
    }
};
int main() {
    cin >> n >> q;
    llong nn = n;
    init(n);
    for (int i = 0; i < nn; i++) {
        llong v;
        cin >> v;
        setv(i, v);
    }
    build();
    for (int i = 0; i < q; i++) {
        llong com, l, r, a;
        cin >> com >> l >> r >> a;
        x = a;
        pair<llong, llong> b = query(l, r, 0, 0, n);
        cout << b.first - (x * b.second) << endl;
    }
    return 0;
}
            
            
            
        
            
toyama