1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <queue>
6 #include <vector>
7 #define max(a, b) ((a) > (b) ? (a) : (b))
8 #define min(a, b) ((a) < (b) ? (a) : (b))
9
10 inline void read(long long &x)
11 {
12 x = 0;char ch = getchar(), c = ch;
13 while(ch < ‘0‘ || ch > ‘9‘)c = ch, ch = getchar();
14 while(ch <= ‘9‘ && ch >= ‘0‘)x = x * 10 + ch - ‘0‘, ch = getchar();
15 if(c == ‘-‘)x = -x;
16 }
17
18 const long long MAXN = 500000 + 10;
19 const long long MAXK = 500000 + 10;
20
21 long long n,k,l,r,num[MAXN],st[20][MAXN],rank[20][MAXN],M,pow2[30],ans;
22
23 struct Node
24 {
25 long long value, l, r, rank, i;
26 Node(long long _value, long long _l, long long _r, long long _rank, long long _i){value = _value, l = _l, r = _r,rank = _rank;i = _i;}
27 Node(){}
28 };
29
30 struct cmp
31 {
32 bool operator()(Node a, Node b)
33 {
34 return a.value < b.value;
35 }
36 };
37
38 std::priority_queue<Node, std::vector<Node>, cmp> q;
39
40 void yuchuli()
41 {
42 while(pow2[M] <= n)++ M;
43 --M;
44 for(register long long i = 1;i <= M;++ i)
45 for(register long long j = 0;j <= n;++ j)
46 {
47 if(j + pow2[i] - 1 > n)continue;
48 if(st[i - 1][j] < st[i - 1][j + pow2[i - 1]])
49 {
50 st[i][j] = st[i - 1][j];
51 rank[i][j] = rank[i - 1][j];
52 }
53 else
54 {
55 st[i][j] = st[i - 1][j + pow2[i - 1]];
56 rank[i][j] = rank[i - 1][j + pow2[i - 1]];
57 }
58 }
59 }
60
61 long long find(long long l, long long r)
62 {
63 if(l > r)
64 {
65 long long tmp = l;
66 l = r;
67 r = tmp;
68 }
69 long long m = 0;
70 while(pow2[m] <= (r - l + 1))++ m;
71 -- m;
72 if(st[m][l] < st[m][r - pow2[m] + 1])
73 return rank[m][l];
74 else
75 return rank[m][r - pow2[m] + 1];
76 }
77
78 int main()
79 {
80 read(n);read(k);read(l);read(r);
81 pow2[0] = 1;
82 for(register long long i = 1;i <= 25;++ i)pow2[i] = (pow2[i - 1] << 1);
83 for(register long long i = 1;i <= n;++ i)
84 {
85 read(num[i]);
86 num[i] += num[i - 1];
87 st[0][i] = num[i];
88 rank[0][i] = i;
89 }
90 yuchuli();
91 for(register long long i = l;i <= n;++ i)
92 {
93 long long k = find(max(0, i - r), max(i - l, 0));
94 q.push(Node(num[i] - num[k], max(0, i - r), max(i - l, 0), k, i));
95 }
96 long long now = 0;
97 register Node tmp;
98 register long long pos;
99 for(;now < k;++ now)
100 {
101 tmp = q.top(), q.pop();
102 long long l = tmp.l, r = tmp.r;
103 ans += tmp.value;
104 if(tmp.l <= tmp.rank - 1 && tmp.l >= 0)
105 {
106 pos = find(max(0, tmp.l), max(tmp.rank - 1, 0));
107 q.push(Node(num[tmp.i] - num[pos], tmp.l, tmp.rank - 1, pos, tmp.i));
108 }
109 if(tmp.r >= tmp.rank + 1)
110 {
111 pos = find(max(0, tmp.rank + 1), max(tmp.r, 0));
112 q.push(Node(num[tmp.i] - num[pos], tmp.rank +1, tmp.r, pos, tmp.i));
113 }
114 }
115 printf("%lld", ans);
116 return 0;
117 }