結果
問題 | No.3078 Difference Sum Query |
ユーザー |
![]() |
提出日時 | 2025-03-28 22:29:53 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,104 ms / 2,000 ms |
コード長 | 4,021 bytes |
コンパイル時間 | 4,099 ms |
コンパイル使用メモリ | 294,452 KB |
実行使用メモリ | 62,328 KB |
最終ジャッジ日時 | 2025-03-28 22:30:19 |
合計ジャッジ時間 | 25,537 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 26 |
ソースコード
#include<bits/stdc++.h>//#include <atcoder/all>using namespace std;//using namespace atcoder;#define all(v) v.begin(),v.end()using ll = long long;using ull = unsigned long long;using lll = __int128;using vll=vector<ll>;using vvll = vector<vector<ll>>;using P = pair<ll,ll>;using vp=vector<pair<ll, ll>>;//using mint=modint1000000007;//using mint=modint998244353;const ll INF=1ll<<60;ll mod10=1e9+7;ll mod99=998244353;const double PI = acos(-1);#define rep(i,n) for (ll i=0;i<n;++i)#define per(i,n) for(ll i=n-1;i>=0;--i)#define rep2(i,a,n) for (ll i=a;i<n;++i)#define per2(i,a,n) for (ll i=a;i>=n;--i)template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }template<typename T>struct merge_sort_tree{ll N=1;vector<vector<T>> node;vector<vector<T>> rw;merge_sort_tree(vector<T>& vec){while(N<(ll)vec.size()) N*=2;node.resize(2*N-1);rw.resize(2*N-1);for(int i=0;i<(int)vec.size();i++) node[N-1+i].push_back(vec[i]);for(int i=N-2;i>=0;i--){merge(node[2*i+1].begin(),node[2*i+1].end(),node[2*i+2].begin(),node[2*i+2].end(),back_inserter(node[i]));}for(int i=0;i<2*N-1;i++){rw[i].push_back(0);for(int j=0;j<(int)node[i].size();j++){rw[i].push_back(node[i][j]+rw[i][j]);}}}//[a,b)でx以下のものの個数ll cntlesseq(ll a,ll b,T x){return cntlesseq_sub(a,b,x,0,0,N);}ll cntlesseq_sub(ll a,ll b,T x,ll k,ll l,ll r){if(r<=a||b<=l) return 0;else if(a<=l&&r<=b){return upper_bound(all(node[k]),x)-node[k].begin();}else{return cntlesseq_sub(a,b,x,2*k+1,l,(l+r)/2)+cntlesseq_sub(a,b,x,2*k+2,(l+r)/2,r);}}//[a,b)でx未満のものの個数ll cntless(ll a,ll b,T x){return cntlesseq(a,b,x-1);}//[a,b)でx以上のものの個数ll cntmoreeq(ll a,ll b,T x){return b-a-cntlesseq(a,b,x-1);};//[a,b)でxより大きいものの個数ll cntmore(ll a,ll b,T x){return b-a-cntlesseq(a,b,x);};//[a,b)でx以下のものの総和T sumlesseq(ll a,ll b,T x){return sumlesseq_sub(a,b,x,0,0,N);}T sumlesseq_sub(ll a,ll b,T x,ll k,ll l,ll r){if(r<=a||b<=l) return 0;else if(a<=l&&r<=b){return rw[k][upper_bound(all(node[k]),x)-node[k].begin()];}else{return sumlesseq_sub(a,b,x,2*k+1,l,(l+r)/2)+sumlesseq_sub(a,b,x,2*k+2,(l+r)/2,r);}}//[a,b)でx未満のものの総和T sumless(ll a,ll b,T x){return sumlesseq(a,b,x-1);}//[a,b)でx以上のものの総和T summoreeq(ll a,ll b,T x){return summoreeq_sub(a,b,x,0,0,N);}T summoreeq_sub(ll a,ll b,T x,ll k,ll l,ll r){if(r<=a||b<=l) return 0;else if(a<=l&&r<=b){return rw[k][rw[k].size()-1]-rw[k][lower_bound(all(node[k]),x)-node[k].begin()];}else{return summoreeq_sub(a,b,x,2*k+1,l,(l+r)/2)+summoreeq_sub(a,b,x,2*k+2,(l+r)/2,r);}}//[a,b)でxより大きいものの総和T summore(ll a,ll b,T x){return summoreeq(a,b,x+1);};//[l,r)でk番目に小さい数long long Kthsmallest(ll a,ll b,ll x){if(x>b-a) return -1;ll l=-1,r=1e18;while(r-l>1){ll m=(r+l)/2;if(cntlesseq(a,b,m)>=x) r=m;else l=m;}return r;}};bool solve(){ll N,Q;cin>>N>>Q;vll A(N);rep(i,N) cin>>A[i];merge_sort_tree<ll> mst(A);rep(_,Q){ll l,r,x;cin>>l>>r>>x;l--;ll ans=0;ans+=-mst.sumless(l,r,x)+mst.summoreeq(l,r,x);ans+=mst.cntless(l,r,x)*x-mst.cntmoreeq(l,r,x)*x;cout<<ans<<endl;}return 0;}int main(){cin.tie(0);ios::sync_with_stdio(false);ll T=1;//cin>>T;rep(i,T) solve();}