There are N squares aligned in a row. The i-th square from the left contains an integer a_i.

Initially, all the squares are white. Snuke will perform the following operation some number of times:

* Select K consecutive squares. Then, paint all of them white, or paint all of them black. Here, the colors of the squares are overwritten.



After Snuke finishes performing the operation, the score will be calculated as the sum of the integers contained in the black squares. Find the maximum possible score.

Constraints

* 1≤N≤10^5
* 1≤K≤N
* a_i is an integer.
* |a_i|≤10^9

Input

The input is given from Standard Input in the following format:


N K
a_1 a_2 ... a_N


Output

Print the maximum possible score.

Examples

Input

5 3
-10 10 -10 10 -10


Output

10


Input

4 2
10 -10 -10 10


Output

20


Input

1 1
-10


Output

0


Input

10 5
5 -4 -5 -8 -4 7 2 -4 0 7


Output

17
#include <bits/stdc++.h>
using namespace std;
const int INF = (0x7FFFFFFFL);
const long long INFF = (0x7FFFFFFFFFFFFFFFL);
const string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int MOD = 1e9 + 7;
const int MODD = 998244353;
const string alphabet = "abcdefghijklmnopqrstuvwxyz";
const double PI = acos(-1.0);
const double EPS = 1e-9;
const string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int dx[9] = {1, 0, -1, 0, 1, -1, -1, 1, 0};
int dy[9] = {0, 1, 0, -1, -1, -1, 1, 1, 0};
template <typename T>
void MACRO_VAR_Scan(T &t) {
  cin >> t;
}
template <typename First, typename... Rest>
void MACRO_VAR_Scan(First &first, Rest &...rest) {
  cin >> first;
  MACRO_VAR_Scan(rest...);
}
template <class T>
ostream &operator<<(ostream &o, const vector<T> &j) {
  o << "{";
  for (int i = 0; i < (int)j.size(); ++i) o << (i > 0 ? ", " : "") << j[i];
  o << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const pair<T, U> &j) {
  o << "{" << j.first << ", " << j.second << "}";
  return o;
}
template <class T, class U>
ostream &operator<<(ostream &o, const map<T, U> &j) {
  o << "{";
  for (auto t = j.begin(); t != j.end(); ++t)
    o << (t != j.begin() ? ", " : "") << *t;
  o << "}";
  return o;
}
template <class T>
ostream &operator<<(ostream &o, const set<T> &j) {
  o << "{";
  for (auto t = j.begin(); t != j.end(); ++t)
    o << (t != j.begin() ? ", " : "") << *t;
  o << "}";
  return o;
}
inline int print(void) {
  cout << endl;
  return 0;
}
template <class Head>
int print(Head &&head) {
  cout << head;
  print();
  return 0;
}
template <class Head, class... Tail>
int print(Head &&head, Tail &&...tail) {
  cout << head << " ";
  print(forward<Tail>(tail)...);
  return 0;
}
inline int debug(void) {
  cerr << endl;
  return 0;
}
template <class Head>
int debug(Head &&head) {
  cerr << head;
  debug();
  return 0;
}
template <class Head, class... Tail>
int debug(Head &&head, Tail &&...tail) {
  cerr << head << " ";
  debug(forward<Tail>(tail)...);
  return 0;
}
template <typename T>
void PA(T &a) {
  int ASIZE = sizeof(a) / sizeof(a[0]);
  for (int ii = 0; ii < ASIZE; ++ii) {
    cout << a[ii] << " \n"[ii == ASIZE - 1];
  }
}
template <typename T>
void PV(T &v) {
  int VSIZE = v.size();
  for (int ii = 0; ii < VSIZE; ++ii) {
    cout << v[ii] << " \n"[ii == VSIZE - 1];
  }
}
inline int YES(bool x) {
  cout << ((x) ? "YES" : "NO") << endl;
  return 0;
}
inline int Yes(bool x) {
  cout << ((x) ? "Yes" : "No") << endl;
  return 0;
}
inline int yes(bool x) {
  cout << ((x) ? "yes" : "no") << endl;
  return 0;
}
inline int yES(bool x) {
  cout << ((x) ? "yES" : "nO") << endl;
  return 0;
}
inline int Yay(bool x) {
  cout << ((x) ? "Yay!" : ":(") << endl;
  return 0;
}
template <typename A, typename B>
void sankou(bool x, A a, B b) {
  cout << ((x) ? (a) : (b)) << endl;
}
inline long long MOP(long long x, long long n, long long m = MOD) {
  long long r = 1;
  while (n > 0) {
    if (n & 1) (r *= x) %= m;
    (x *= x) %= m;
    n >>= 1;
  }
  return r;
}
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
inline long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
inline long long POW(long long a, long long b) {
  long long c = 1ll;
  do {
    if (b & 1) c *= 1ll * a;
    a *= 1ll * a;
  } while (b >>= 1);
  return c;
}
template <typename T, typename A, typename B>
inline bool between(T x, A a, B b) {
  return ((a <= x) && (x < b));
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
template <typename A, typename B>
inline bool chmax(A &a, const B &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename A, typename B>
inline bool chmin(A &a, const B &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
struct abracadabra {
  abracadabra() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(20);
    cerr << fixed << setprecision(5);
  };
} ABRACADABRA;
template <class T>
struct CumulativeSum {
  vector<T> data;
  CumulativeSum(int sz) : data(sz, 0){};
  void add(int k, T x) { data[k] += x; }
  void build() {
    for (int i = 1; i < data.size(); i++) {
      data[i] += data[i - 1];
    }
  }
  T query(int k) {
    if (k < 0) return (0);
    return (data[min(k, (int)data.size() - 1)]);
  }
  T query(int l, int r) {
    T ret = (data[min(r - 1, (int)data.size() - 1)]);
    if (l >= 0) ret -= (data[min(l - 1, (int)data.size() - 1)]);
    return ret;
  }
};
signed main() {
  int N, K;
  MACRO_VAR_Scan(N, K);
  ;
  vector<int> A(N);
  for (auto &i : A) cin >> i;
  ;
  CumulativeSum<long long> a(N), b(N);
  for (long long i = long long(0); i < long long(N); ++i) {
    a.add(i, max(0, A[i]));
    b.add(i, A[i]);
  }
  a.build();
  b.build();
  long long res = -INFF;
  for (long long left = long long(0); left < long long(N - K + 1); ++left) {
    long long tmp = 0;
    tmp += a.query(left - 1);
    tmp += a.query(left + K, N);
    tmp += max<long long>(0, b.query(left, left + K));
    res = max(res, tmp);
  }
  print(res);
}
