1+ #include < iostream>
2+ #include < cassert>
3+ #include < vector>
4+ #include < algorithm>
5+ using namespace std ;
6+
7+ template <typename T>
8+ struct MergeSortTree {
9+ int n;
10+ vector<vector<T> >dat;
11+ vector<vector<long long > >sum;
12+
13+ // 和がいらない場合 sum_mode : false にするほうがよい
14+ MergeSortTree (const vector<T>&v,bool sum_mode = true )
15+ {
16+ n=1 ;
17+ while (n<(int )v.size ())n<<=1 ;
18+ dat.assign (2 *n-1 ,vector<T>{});
19+ if (sum_mode) sum.assign (2 *n-1 ,vector<long long >{});
20+ for (int i=0 ;i<(int )v.size ();i++)
21+ {
22+ dat[i+n-1 ].push_back (v[i]);
23+ if (sum_mode){
24+ sum[i+n-1 ].push_back (0LL );
25+ sum[i+n-1 ].push_back (v[i]);
26+ }
27+ }
28+ for (int i=n-2 ;i>=0 ;i--)
29+ {
30+ dat[i].resize (dat[i*2 +1 ].size ()+dat[i*2 +2 ].size ());
31+ merge (dat[i*2 +1 ].begin (),dat[i*2 +1 ].end (),
32+ dat[i*2 +2 ].begin (),dat[i*2 +2 ].end (),
33+ dat[i].begin ()
34+ );
35+ if (sum_mode){
36+ sum[i].resize (dat[i].size ()+1 ,0LL );
37+ for (int j=0 ;j<(int )dat[i].size ();j++)sum[i][j+1 ]=sum[i][j]+dat[i][j];
38+ }
39+ }
40+ }
41+
42+ // [a,b) sum(*<x)
43+ long long less_sum (int a,int b,T x,int k=0 ,int l=0 ,int r=-1 )const {
44+ if (r<0 )r=n;
45+ if (b<=l||r<=a)return 0LL ;
46+ else if (a<=l&&r<=b)
47+ {
48+ int L=lower_bound (dat[k].begin (),dat[k].end (),x)-dat[k].begin ();
49+ return sum[k][L];
50+ }
51+ else return less_sum (a,b,x,k*2 +1 ,l,(l+r)/2 )+less_sum (a,b,x,k*2 +2 ,(l+r)/2 ,r);
52+ }
53+
54+ // [a,b) sum(*<=x)
55+ long long lower_sum (int a,int b,T x,int k=0 ,int l=0 ,int r=-1 )const {
56+ return less_sum (a,b,x+1 ,k,l,r);
57+ }
58+
59+ // [a,b) count(*<x)
60+ int less_cnt (int a,int b,T x,int k=0 ,int l=0 ,int r=-1 )const {
61+ if (r<0 )r=n;
62+ if (b<=l||r<=a)return 0 ;
63+ else if (a<=l&&r<=b)return lower_bound (dat[k].begin (),dat[k].end (),x)-dat[k].begin ();
64+ else return less_cnt (a,b,x,k*2 +1 ,l,(l+r)/2 )+less_cnt (a,b,x,k*2 +2 ,(l+r)/2 ,r);
65+ }
66+
67+ // [a,b) count(*<=x)
68+ int lower_cnt (int a,int b,T x,int k=0 ,int l=0 ,int r=-1 )const {
69+ return less_cnt (a,b,x+1 ,k,l,r);
70+ }
71+
72+ };
73+
74+ int main (){
75+ int n,q;
76+ scanf (" %d %d" ,&n,&q);
77+
78+ vector<long long > a (n);
79+ for (int i = 0 ;i < n;i++) scanf (" %lld" ,&a[i]);
80+
81+ MergeSortTree<long long > mst (a);
82+
83+ for (int query = 0 ;query < q;query++){
84+ int l,r,x;
85+ scanf (" %d %d %d" ,&l,&r,&x);
86+ int ans_cnt = mst.lower_cnt (l,r,x);
87+ long long ans_sum = mst.lower_sum (l,r,x);
88+ printf (" %d %lld\n " ,ans_cnt,ans_sum);
89+ }
90+
91+ return 0 ;
92+ }
0 commit comments