#include <bits/stdc++.h>
#define int long long
#define fast ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define lg2(n) (63-__builtin_clzll(n))
#define mask(n) (1LL << (n))
#define TASK ""
#define openfile();  if( fopen(TASK".inp", "r")){freopen(TASK".inp", "r", stdin);freopen(TASK".out", "w", stdout);}
#define lc(n) (n << 1)
#define rc(n) ((n << 1) | 1)

#define fi first
#define se second
#define FOR(i, l, r, k) for( int i = l; i <= r; i += k)
#define FOD(i, r, l, k) for( int i = r; i >= l; i -= k)

#define mii map<int,int>
#define umi unordered_map<int, int>
#define pii pair<int,int>
#define vi vector<int>

using namespace std;

const int oo = 1e18;
const int mod = 998244353;
const int nmax = 2e5 + 8;
const int base = 311;

int n, k, a[nmax], x, st[19][nmax], f[nmax];

vi pos[nmax];

void pre(){
    for(int i = 1; i <= n; ++i) st[0][i] = a[i];
    for(int i = 1; i <= lg2(n); ++i){
        for(int j = 1; j <= n - mask(i) + 1; ++j){
            st[i][j] = min(st[i - 1][j], st[i - 1][j + mask(i - 1)]);
        }
    }
}

int get(int l, int r){
    int k = lg2(r - l + 1);
    return min(st[k][l], st[k][r - mask(k) + 1]);
}

void cmp(){
    vector<int> v;
    for(int i = 1; i <= n; ++i) v.push_back(a[i]);
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for(int i = 1; i <= n; ++i){
        a[i] = lower_bound(v.begin(), v.end(), a[i]) - v.begin() + 1;
    }
}
int sol(int i, int val, const vi &v){
    int l = 0, r = v.size() - 1, pos = -1;
    while(l <= r){
        int mid = l + r >> 1;
        bool ok = 1;
        ok = (v[mid] + 1 <= i - 1 && get(v[mid] + 1, i - 1) < a[i]);
        if(v[mid] <= i - val && ok){
            l = mid + 1;
            pos = mid;
        }
        else r = mid - 1;
    }
    return pos;
}
int pf[nmax];
int calc(int val){
    vector<vi> dp(k + 1, vi(n + 1, 0));
//    vector<vi> pf(n + 1, 0);
    for(int i = 1; i <= n; ++i){
        f[i] = 0;
        int j = sol(i, val, pos[a[i]]);
        if(j != -1) f[i] = i - pos[a[i]][j] + 1;
        if(f[i - 1]){
            if(f[i]) f[i] = min(f[i], f[i - 1] + 1);
            else f[i] = f[i - 1] + 1;
        }
        if(!val) f[i] = 1;
    }
    dp[0][0] = 1, pf[0] = 1;
    for(int i = 1; i <= k; ++i){
        pf[0] = dp[i - 1][0];
        for(int j = 1; j <= n; ++j){
            pf[j] = (pf[j - 1] + dp[i - 1][j]) % mod;
        }
        for(int j = 1; j <= n; ++j){
            if(f[j]){
                dp[i][j] = pf[j - f[j]];
            }
//            cout << i << ' ' << j << ' ' << dp[i][j] << endl;
        }
    }
    return dp[k][n];
}

main(){
    fast;
    openfile();
    cin >> n >> k >> x;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
    }
    cmp();
    pre();
    for(int i = 1; i <= n; ++i){
        pos[a[i]].push_back(i);
    }
    cout << (calc(x) - calc(x + 1) + mod) % mod;
}
