#include<bits/stdc++.h>
#define ll           long long int
#define pb           push_back
#define F            first
#define S            second
using namespace std;
struct node
{
    int lc,rc,lazy;
};
vector<node> nodes;
void update(int i,int l,int r,int L,int R,int x)
{
    if((L>R)||(L>r)||(R<l))
        return;
    R=min(r,R);
    L=max(l,L);
    if((l==L)&&(r==R))
    {
        nodes[i].lazy+=x;
        return;
    }
    int mid=(l+r)>>1;
    if(L>mid)
    {
        if(!(nodes[i].rc))
        {
            node temp=nodes[0];
            nodes[i].rc=nodes.size();
            nodes.pb(temp);
        }
        update(nodes[i].rc,mid+1,r,L,R,x);
    }
    else if(R<=mid)
    {
        if(!(nodes[i].lc))
        {
            node temp=nodes[0];
            nodes[i].lc=nodes.size();
            nodes.pb(temp);
        }
        update(nodes[i].lc,l,mid,L,R,x);
    }
    else
    {
        if(!(nodes[i].rc))
        {
            node temp=nodes[0];
            nodes[i].rc=nodes.size();
            nodes.pb(temp);
        }
        update(nodes[i].rc,mid+1,r,mid+1,R,x);
        if(!(nodes[i].lc))
        {
            node temp=nodes[0];
            nodes[i].lc=nodes.size();
            nodes.pb(temp);
        }
        update(nodes[i].lc,l,mid,L,mid,x);
    }
}
void get(int i,int l,int r,int *a,int x)
{
    if(l==r)
    {
        a[l]=nodes[i].lazy+x;
        return;
    }
    int mid=(l+r)>>1;
    x+=nodes[i].lazy;
    get(nodes[i].lc,l,mid,a,x);
    get(nodes[i].rc,mid+1,r,a,x);
}
int main()
{
	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
	int n,m,k;
    node temp;
    temp.lc=temp.rc=temp.lazy=0;
    cin>>n>>m>>k;
    int l[m],r[m];
    for(int i=0;i<m;++i)
        cin>>l[i]>>r[i];
    for(int i=0;i<=n;++i)
        nodes.pb(temp);
    for(int i=0;i<m;++i)
    {
        for(int x=1;(x+k-1)<=n;++x)
        {
            if(r[i]<x)
                continue;
            int y=max(l[i],x);
            if(r[i]<(x+k))
            {
                update(x,x,n-k+1,x,x,r[i]-y+1);
            }
            else
            {
                if(y<(x+k))
                {
                    int l1=x+k-y;
                    if((r[i]-y+1)>k)
                    {
                        update(x,x,n-k+1,x,x,l1);
                        update(x,x,n-k+1,x+1,l[i],1);
                        update(x,x,n-k+1,r[i]-k+2,r[i]-l1+1,-1);
                    }
                    else
                    {
                        update(x,x,n-k+1,x,x,l1);
                        update(x,x,n-k+1,x+1,r[i]-k+1,1);
                        update(x,x,n-k+1,l[i]+1,r[i]-l1+1,-1);
                    }
                }
                else
                {
                    if((r[i]-y+1)>k)
                    {
                        update(x,x,n-k+1,l[i]-k+1,l[i],1);
                        update(x,x,n-k+1,r[i]-k+2,r[i]+1,-1);
                    }
                    else
                    {
                        update(x,x,n-k+1,l[i]-k+1,r[i]-k+1,1);
                        update(x,x,n-k+1,l[i]+1,r[i]+1,-1);
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=1;(i+k-1)<=n;++i)
    {
        int s=n-k+1-i+1;
        int a[s];
        get(i,0,n-k+1-i,a,0);
        ans=max(ans,a[0]);
        for(int j=1;j<s;++j)
        {
            a[j]+=a[j-1];
            ans=max(ans,a[j]);
        }
    }
    cout<<ans;
	return 0;
}