#include<iostream>
#include<algorithm>
using namespace std;
int n,m,s,k;
void in(int &x)
{
char c=getchar();x=0;
while(c<'0'||c>'9')c=getchar();
while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
}
void out(int x)
{
if(x>9)out(x/10);
putchar(x%10+'0');
}
long long f[200010];
struct tree
{
int c[1010];
int l;
int from;
}e[200010];
bool cmp(int a,int b)
{
return a>b;
}
bool b[200010];
long long ans,t,num;
int kind;
int main()
{
freopen("express.in","r",stdin);
freopen("express.out","w",stdout);
in(n),in(m),in(s),in(k);
for(int i=1;i<=m;i++)
{
in(kind),in(e[kind].c[++e[kind].l]);
e[kind].c[e[kind].l]-=2;
}
for(int i=1;i<=n;i++)
sort(e[i].c+1,e[i].c+e[i].l+1,cmp);
for(int i=1;i<=n;i++)
{
t=0;
for(int j=1;j<=e[i].l;j++)
{
t+=e[i].c[j];
if(t>=k)
{
s-=j;
e[i].from=j+1;
ans+=t;
break;
}
}
if(t<k||s<0)
{
cout<<"-23333333";
return 0;
}
}
for(int i=1;i<=n;i++)
for(int z=e[i].from;z<=e[i].l;z++)
for(int j=s;j>=1;j--)
f[j]=max(f[j],f[j-1]+e[i].c[z]);
cout<<f[s]+ans;
return 0;
}