#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; bool rcmp(int a, int b) { return a>b; } typedef long long LL; class mypcmp { public: bool operator()(const int& a, const int& b) { return a> ss1[18]; multiset> ss2[18]; LL vv[1<<17]; int mx, ix[1<<19]; int as[64], bs[64]; void setv(int i, int v) { i+=mx; while(i) { ix[i]+=v; i>>=1; } } int count(int s, int e) { int r=0; s+=mx; e+=mx; while(s<=e) { if (s&1) { r+=ix[s]; s++; } if ((e&1)==0) { r+=ix[e]; e--; } s>>=1; e>>=1; } return r; } int main() { int n, i, k, l, p, m, x, mm, m2, c, j, jj, ii; LL a, b, r=0, xv; multiset> ss; scanf("%d %d %d %d", &n, &k, &l, &p); for (i=0; il||c>k) continue; ss1[c].insert({a, b}); if (b>=p) r++; } m2=n-m; mm = 1<<(n-m); for (x=1; xl||c>k) continue; ss2[c].insert({a, b}); if (b>=p) r++; } i=k; if (i>m) i=m; j=0; for (i=m; i>0; i--) { if (ss1[i].size()==0) continue; while(j+i<=k&&j<=m2) { for (auto x: ss2[j]) ss.insert(x); j++; } if (ss.size()==0) continue; // build seg c=0; for (auto x: ss1[i]) { vv[c++]=x.second; } sort(vv, vv+c); jj=0; for (ii=0; iifirst+x.first<=l) break; setv(lower_bound(vv, vv+c, e->second)-vv, -1); e++; } if (e==ss1[i].rend()) break; xv = p-x.second; r+=count(lower_bound(vv, vv+c, xv)-vv, c); } } printf("%lld\n", r); return 0; }