10 5 5
2 3 4 5 6
 1 1 1
1
 1000000000000000000 10 68
9818112234872670 233245257111863071 266483628625876079 375103213040049805 431982380866113633 489732004669478331 501030096787260719 541800997319766183 551892546260532408 696178619227890200
 1000000000000000000 2 1
1 1000000000000000000
 33 32 1
1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 101 55 10
1 3 5 7 8 9 10 16 18 21 22 23 24 25 27 30 32 35 36 37 38 39 40 43 45 47 49 50 51 52 54 57 59 61 64 66 67 68 69 70 71 72 73 80 83 86 87 88 89 90 91 92 96 97 98
 1000000000000000000 5 1000
1 1000000000 1000000000000 1000000000000000 1000000000000001
 15 15 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 21 21 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 45 43 2
1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
 107 20 13
5 9 20 25 26 30 37 45 51 58 62 73 82 87 89 90 99 101 104 106
 3 2 1
1 2
 1000000000 2 1000000000
1 1000000000
 11 7 3
2 3 4 5 6 7 11
 13 9 4
1 2 3 6 7 8 11 12 13
 1000000000000000000 2 1000000000
102306300054748096 267367244641009859
 16 7 5
2 3 4 5 6 15 16
 35 35 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 1000000000000000000 20 365
31881893160049984 103938857870698567 103962228223609431 140762820261865064 175962215264653912 239086305245565642 354522451098745823 383839975876242372 443471287955807705 478923027151493682 511195154588214957 619570919279066139 677571312513476877 705864797651447277 789633853044745934 867300890280086078 883297431113041450 891736036124527038 937306858250803630 990892290394455512

2
 1
 10
 2
 32
 15
 4
 1
 2
 35
 9
 2
 1
 4
 4
 2
 4
 35
 20

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.TreeSet;


public class Main {
	static Scanner sc = new Scanner(System.in);
	
	public static char returnLetter(int n)
	{
		if(n%4==1)
		{
			return 'A';
		}
		else if(n%4==3)
		{
			return 'B';
		}
		else if(n%4==2)
		{
			return 'C';
		}
		else
		{
			return 'D';
		}
	}
	/*public static void main(String[] args) throws IOException {
		int n=sc.nextInt();
		
		int zero=n;
		int one=n+1;
		int two=n+2;
		char z=returnLetter(zero);
		char o=returnLetter(one);
		char t=returnLetter(two);
		
		if(z<o && z<t)
		{
			System.out.println("0 " + z);
		}
		else if(o<z && o<t)
		{
			System.out.println("1 " + o);
		}
		else if(t<z && o>t)
		{
			System.out.println("2 " + t);
		}
	}*/
	
	/*public static void main(String[] args) throws IOException {
		String[] a= new String[3];
		
		for (int i = 0; i < a.length; i++) {
			a[i]=sc.next();
		}
		boolean equal=true;
		
		for (int i = 1; i < a.length; i++) {
			if(a[i].charAt(1)!=a[i-1].charAt(1) || a[i].charAt(0)!=a[i-1].charAt(0))
			{
				equal=false;break;
			}
		}
		if(equal)
		{
			System.out.println(0);
		}
		else
		{
			Arrays.sort(a);
			boolean ord=true;
			
			for (int i = 1; i < a.length; i++) {
				if(a[i].charAt(1)!=a[i-1].charAt(1) || a[i].charAt(0)-a[i-1].charAt(0)!=1)
				{
					ord=false;break;
				}
			}
			if(ord)
			{
				System.out.println(0);
			}
			else
			{
				if(a[1].charAt(1)==a[0].charAt(1) && a[1].charAt(0)-a[0].charAt(0)==2)
				{
					System.out.println(1);
				}
				else if(a[2].charAt(1)==a[1].charAt(1) && a[2].charAt(0)-a[1].charAt(0)==2)
				{
					System.out.println(1);

				}
				else if(a[2].charAt(1)==a[0].charAt(1) && a[2].charAt(0)-a[0].charAt(0)==2)
				{
					System.out.println(1);

				}
				else if(a[0].charAt(1)==a[1].charAt(1) && a[0].charAt(0)-a[1].charAt(0)==2)
				{
					System.out.println(1);

				}
				else if(a[1].charAt(1)==a[2].charAt(1) && a[1].charAt(0)-a[2].charAt(0)==2)
				{
					System.out.println(1);

				}
				else if(a[0].charAt(1)==a[2].charAt(1) && a[0].charAt(0)-a[2].charAt(0)==2)
				{
					System.out.println(1);

				}
				else if(a[1].charAt(1)==a[0].charAt(1) && a[1].charAt(0)-a[0].charAt(0)==1)
				{
					System.out.println(1);

				}
				else if(a[2].charAt(1)==a[1].charAt(1) && a[2].charAt(0)-a[1].charAt(0)==1)
				{
					System.out.println(1);
				}
				else if(a[2].charAt(1)==a[0].charAt(1) && a[2].charAt(0)-a[0].charAt(0)==1)
				{
					System.out.println(1);
				}
				else if(a[0].charAt(1)==a[1].charAt(1) && a[0].charAt(0)-a[1].charAt(0)==1)
				{
					System.out.println(1);

				}
				else if(a[1].charAt(1)==a[2].charAt(1) && a[1].charAt(0)-a[2].charAt(0)==1)
				{
					System.out.println(1);

				}
				else if(a[0].charAt(1)==a[2].charAt(1) && a[0].charAt(0)-a[2].charAt(0)==1)
				{
					System.out.println(1);

				}
				else if(a[1].charAt(1)==a[0].charAt(1) && a[1].charAt(0)==a[0].charAt(0))
				{
					System.out.println(1);

				}
				else if(a[2].charAt(1)==a[1].charAt(1) && a[1].charAt(0)==a[2].charAt(0))
				{
					System.out.println(1);

				}
				else
				{
					System.out.println(2);
				}
				
			}
		}
	}*/
	
	public static void main(String[] args) throws IOException {
		long n=sc.nextLong();
		long m=sc.nextLong();
		long k=sc.nextLong();
		TreeSet<Long> special=new TreeSet<Long>();
		
		for (int i = 0; i < m; i++) {
			long temp=sc.nextLong();
			special.add(temp);
		}
		
		long moves=0;
		long f=1;
		long l=k;
		long s=special.first();
		
		while(!special.isEmpty())
		{
			if(s>l)
			{
				long t=(s-(l+1))/k;
				//System.out.println(t);
				f=l+1+t*k;
				l=l+(t+1)*k;
			}
			//System.out.println(f + " " + l);
			long count=0;
			while(!special.isEmpty() && f<=s && s<=l)
			{
				if(s==f)
				{
					f++;
				}
				s=special.pollFirst();
				count++;
				if(!special.isEmpty())
				s=special.first();
			}
			l+=count;
			moves++;
			//System.out.println(moves);
		}
		System.out.println(moves);
	}
	static class Scanner {
		StringTokenizer st;
		BufferedReader br;
 
		public Scanner(InputStream s) {
			br = new BufferedReader(new InputStreamReader(s));
		}
 
		public String next() throws IOException {
			while (st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}
 
		public int nextInt() throws IOException {
			return Integer.parseInt(next());
		}
 
		public long nextLong() throws IOException {
			return Long.parseLong(next());
		}
 
		public String nextLine() throws IOException {
			return br.readLine();
		}
 
		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			int start = 0;
			boolean dec = false, neg = false;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}
 
		public boolean ready() throws IOException {
			return br.ready();
		}
 
	}
}