#include<fstream.h>
struct nod {
int info;
nod *next;
};
int poz(int a[50002], int b[50002], int p, int u)
{
int piva,pivb,aux;
piva=a[p];pivb=b[p];
while (p<u)
{
if (a[p]>a[u] || a[p]==a[u] && b[p]>b[u]) {
aux=a[p];a[p]=a[u];a[u]=aux;
aux=b[p];b[p]=b[u];b[u]=aux;
}
if (piva==a[p] && pivb==b[p]) u--;
else p++;
}
return p;
}
void quick (int a[50002], int b[50002], int p, int u)
{
int k;
if (p<u) {
k=poz(a,b,p,u);
quick(a,b,p,k-1);
quick(a,b,k+1,u);
}
}
void calculeaza (int ap[1002],int k,int t[50002], int poz, int p1[50002], int v[1002], int &m, nod *&p, nod *&u)
{
nod *t1,*q;
int j,sw=0;
if (!p) {p=new nod;p->info=p1[poz];
u=p;u->next=0;sw=1;}
for (j=poz-sw;j>=1 && t[poz]==t[j];j--)
if (p1[j]>=p->info) {q=new nod; q->info=p1[j];
q->next=p;p=q;}
else if (p1[j]<=u->info) {q=new nod;
q->info=p1[j];
u->next=q;
u=q;u->next=0;}
else {
q=p;
while (q->next->info>p1[j])
q=q->next;
t1=new nod;
t1->next=q->next;
q->next=t1;
t1->info=p1[j];
}
q=p; m++;v[m]=0;ap[m]=t[poz];
while (q && k)
{
v[m]+=q->info;
k--;
q=q->next;
}
if (v[m]==v[m-1]) m--;
}
int main()
{
int ap[1002],i,n,k,v[1002],t[50002],p1[50001],m=0,T;
ifstream f("peste.in");
f>>n>>k>>T; v[0]=0;
for (i=1;i<=n;i++)
f>>p1[i]>>t[i];
f.close();
quick(t,p1,1,n);
nod *p,*u,*q;
p=0;t[0]=p1[0]=0;
for (i=1;i<n;i++)
if (t[i]!=t[i+1]) calculeaza (ap,k,t,i,p1,v,m,p,u);
calculeaza(ap,k,t,n,p1,v,m,p,u);
long long pg[50002],j;
memset(pg,0,sizeof(pg));
for (i=1;i<=m;i++)
if (pg[ap[i]]<v[i]) pg[ap[i]]=v[i];
for (j=1;j<=T;j++)
if (pg[j]!=0)
for (i=1;i<=m;i++)
if (pg[j+ap[i]]<pg[j]+v[i]) pg[j+ap[i]]=pg[j]+v[i];
long long max=0;
for (i=1;i<=T;i++) if (max<pg[i]) max=pg[i];
ofstream g("peste.out");
g<<max;
g.close();
return 0;
}