#include<stdio.h>
#include<map>
#include<string.h>


const int LIMIT=2000;
int xs[LIMIT+1];
std::map<int,int> ts;
int dp[LIMIT+1][LIMIT+1];

int main(){
	int s,n,m;
	scanf("%d %d %d",&s,&n,&m);
	for(int i=0;i<s;i++){
		scanf("%d",&xs[i]);
	}
	int t,p;
	for(int i=0;i<n;i++){
		scanf("%d %d",&t,&p);
		ts[t-xs[p-1]]++;
	}
	std::map<int,int> temp;
	std::map<int,int>::iterator it;
	int minT=(*(ts.begin())).first;
	for(it=ts.begin();it!=ts.end();it++){
		temp[(*it).first-minT]=(*it).second;
	}
	ts.clear();
	ts.insert(temp.begin(),temp.end());
	std::map<int,int>::reverse_iterator rIt;
	
	
	rIt=ts.rbegin();
	int oldF=(*rIt).first;
	rIt++;
	memset(dp,-1,sizeof(dp));
	dp[1][1]=0;
	int size=1;
	int pos=2;
	int sums[LIMIT+1]={0};
	for(;rIt!=ts.rend();rIt++){
		size++;
		if(m<size)size=m;
		
		int f=(*rIt).first;
		int s=(*rIt).second;
		//printf("<%d %d>",f,s);
		
		for(int i=1;i<=size;i++){
			if(dp[pos-1][i]!=-1){
				sums[i]+=oldF-f;
				dp[pos][i]=dp[pos-1][i]+sums[i]*s;
			}
		}
		for(int i=2;i<=size;i++){
			if(dp[pos][i]==-1){
				sums[i]=0;
				dp[pos][i]=dp[pos-1][i-1];
			}else{
				if(dp[pos][i]>=dp[pos-1][i-1]){
					sums[i]=0;
					dp[pos][i]=dp[pos-1][i-1];
				}
			}
		}
		//printf("(%d %d)",size,dp[pos][size]);
		//for(int i=0;i<4;i++){
		//	for(int j=0;j<4;j++){
		//		printf("%d\t",dp[i+1][j+1]);
		//	}
		//	printf("\n");
		//}
		//printf("\n");
		pos++;
		oldF=f;
	}
	printf("%d\n",dp[pos-1][size]);
}