結果
問題 | No.3078 Difference Sum Query |
ユーザー |
|
提出日時 | 2025-04-03 14:03:07 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 746 ms / 2,000 ms |
コード長 | 2,942 bytes |
コンパイル時間 | 1,778 ms |
コンパイル使用メモリ | 110,888 KB |
実行使用メモリ | 57,048 KB |
最終ジャッジ日時 | 2025-04-03 14:03:25 |
合計ジャッジ時間 | 16,191 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 26 |
ソースコード
#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=lower_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++){ll l,r,x;cin >> l >> r >>x;l--;cout << seg.get(l,r,x) << endl;}}int main(){solve();return 0;}