結果

問題 No.3078 Difference Sum Query
ユーザー graph11463
提出日時 2025-04-03 13:51:28
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 2,943 bytes
コンパイル時間 1,458 ms
コンパイル使用メモリ 110,644 KB
実行使用メモリ 57,048 KB
最終ジャッジ日時 2025-04-03 13:51:42
合計ジャッジ時間 14,341 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 12 WA * 14
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
using ll =long long;
vector<ll> SumVec(vector<ll> base){
    vector<ll> res;
    res.resize(base.size()+1);
    for(int i=0;i<base.size();i++){
        res[i+1]=res[i]+base[i];
    }
    return res;
}
struct SegVec{
    vector<vector<ll>> node;
    vector<vector<ll>> nodeSum;
    ll n,sz,log;
    SegVec() : SegVec(0){}
    SegVec(ll N) : SegVec(vector<ll>(N,0)){}
    SegVec(vector<ll> vec) : n(vec.size()){
        sz=1;
        log=0;
        while(n>sz){
            sz*=2;
            log++;
        }
        node.resize(2*sz);
        nodeSum.resize(2*sz);
        for(ll i=0;i<n;i++){
            node[sz+i].push_back(vec[i]);
        }
        for(ll i=sz-1;i>0;i--){
            for(ll j=0;j<node[i*2].size();j++){
                node[i].push_back(node[i*2][j]);
            }
            for(ll j=0;j<node[i*2+1].size();j++){
                node[i].push_back(node[i*2+1][j]);
            }
            sort(node[i].begin(),node[i].end());
        }
        for(ll i=2*sz-1;i>0;i--){
            nodeSum[i]=SumVec(node[i]);
        }
    }
    void dbg(ll p,int k=1){
        cout << "dbg: "<< p << ": ";
        cout << "{ ";
        for(auto v:node[p]){
            cout << v <<",";
        }
        cout << "} ";
        if(k){
            cout << endl;
        }else{
            cout <<", ";
        }
        return;
    }
    void dbg_all(){
        for(ll i=0;i<=log;i++){
            for(ll j=(1LL<<i);j<(1LL<<(i+1));j++){
                dbg(j,0);
            }
            cout << endl;
        }
    }
    ll get(int l, int r,ll x){
        ll ans=0;
        l += sz;
        r += sz;
        while (l < r) {
            if (l & 1){
                auto It=lower_bound(node[l].begin(),node[l].end(),x);
                ans+=nodeSum[l].back()-nodeSum[l][It-node[l].begin()]-x*(nodeSum[l].size()-(It-node[l].begin())-1);
                //cout << "L: "<< It-node[l].begin()<< endl;
                //cout << ans << endl;
                //dbg(l);
                ans+=x*(It-node[l].begin())-nodeSum[l][It-node[l].begin()];
                l++;
            }
            if (r & 1){
                r--;
                auto It=upper_bound(node[r].begin(),node[r].end(),x);
                //cout << "R: "s<< It-node[r].begin()<< endl;
                //dbg(r);
                ans+=nodeSum[r].back()-nodeSum[r][It-node[r].begin()]-x*(nodeSum[r].size()-(It-node[r].begin())-1);
                ans+=x*(It-node[r].begin())-nodeSum[r][It-node[r].begin()];
            }
            l >>= 1;
            r >>= 1;
        }
        return ans;
    }
    
};
void solve(){
    int N,Q;cin >> N >> Q;
    vector<ll> A(N);
    for(auto &v:A){
        cin >> v;
    }
    SegVec seg(A);
    for(int i=0;i<Q;i++){
        int l,r,x;cin >> l >> r >>x;
        l--;
        cout << seg.get(l,r,x) << endl;
    }
}
int main(){
    solve();
    return 0;
}
0