stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include<iostream>

#include<cstdio>

#include<iomanip>

#include<algorithm>

#include<vector>

#include<set>

#include<list>

#include<queue>

#include<deque>

#include<unordered_map>

#include<map>

#include<string>

#include<cstring>

#include<stack>

#include<cmath>



#define vint vector<int>

#define vstr vector<string>

#define vll vector<long long>

#define ll long long

#define pf printf

#define sf scanf

#define sfd(n) scanf("%d", &n)

#define sflf(n) scanf("%lf", &n)

#define sfll(n) scanf("%lld", &n)

#define pfd(n) printf("%d", n)

#define pflf(n) printf("%lf", n)

#define pfll(n) printf("%lld", n)

#define pft	printf("\t")

#define pfn printf("\n")

#define pfk printf(" ")

#define PI 3.1415926

#define MAX 100000

#define M 1e18



using namespace std;



int main() {

	int h, w;

	int n;

	sfd(h);

	sfd(w);

	sfd(n);

	int num;

	int** ans = new int*[h];

	for( int i=0; i<h; i++ ) {

		ans[i] = new int[w];

	}

	bool f = false;

	int l = 0, k = 0;

	for( int i=1; i<=n; i++ ) {

		sfd(num);

		for( int j=0; j<num; j++ ) {

			ans[l][k] = i;

//			cout << "l = " << l << "    k = " << k << endl;

			if( l%2==0 ) {

				k++;

			}else {

				k--;

			}

			if( k>=w ) {

				k--;

				l++;

			}

			if( k<0 ) {

				k++;

				l++;

			}

			if( l>=h ) {

				f = true;

				break;

			}

		}

		if( f ) {

			break;

		}

	}

	for( int i=0; i<h; i++ ) {

		for( int j=0; j<w; j++ ) {

			pfd(ans[i][j]);

			if( j<w-1 ) {

				pfk;

			}

		}

		pfn;

	}



	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 5.18004405759413x):
#include<cstdio>

const int maxn = 110;

int tag[maxn*maxn];

int tmp[maxn*maxn];

int ans[maxn][maxn];

int main()

{

	int n,m;

	while(~scanf("%d%d",&n,&m)){

		int times,cnt = 1,change = 1;

		scanf("%d",&times);

		for(int i = 1; i <= times; i++){

			scanf("%d",&tag[i]);

			for(int j = 1; j<=tag[i]; j++){

				tmp[cnt] = i; cnt++;

			}

		}

		cnt = 1;

		for(int i = 1; i<=n; i++){

			if(change == 1){

				for(int j = 1; j<=m; j++){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}else {

				for(int j = m; j>=1; j--){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}

			change = change * -1;

		}

		for(int i = 1; i<=n; i++){

			for(int j = 1; j<=m; j++){

				if(j == 1) printf("%d ",ans[i][j]);

				else printf("%d ",ans[i][j]);

			}

			printf("\n");

		}

	}

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;



int a[100005];

int rlt[105][105];

int main(){

	int h, w, n;

	cin >> h >> w >> n;

	for(int i = 0; i < n; i ++) cin >> a[i];

	int cur = 0, cnt = 0;

	for(int i = 0; i < h; i ++){

		if(i % 2 == 0){

			for(int j = 0; j < w; j ++){

				rlt[i][j] = cur;

				a[cur] --;

				if(a[cur] == 0) cur ++; 

			}

		}

		else {

			for(int j = w - 1; j  >= 0; j --){

				rlt[i][j] = cur;

				a[cur] --;

				if(a[cur] == 0) cur ++; 

			}

		}

	}

	for(int i = 0; i < h; i ++){

		for(int j = 0; j < w; j ++){

			cout << rlt[i][j] + 1 << " \n"[j == w - 1];

		}

	}

}


// Faster C++ solution for the same problem (measured speedup: 5.190804500956323x):
#include<cstdio>

const int maxn = 110;

int tag[maxn*maxn];

int tmp[maxn*maxn];

int ans[maxn][maxn];

int main()

{

	int n,m;

	while(~scanf("%d%d",&n,&m)){

		int times,cnt = 1,change = 1;

		scanf("%d",&times);

		for(int i = 1; i <= times; i++){

			scanf("%d",&tag[i]);

			for(int j = 1; j<=tag[i]; j++){

				tmp[cnt] = i; cnt++;

			}

		}

		cnt = 1;

		for(int i = 1; i<=n; i++){

			if(change == 1){

				for(int j = 1; j<=m; j++){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}else {

				for(int j = m; j>=1; j--){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}

			change = change * -1;

		}

		for(int i = 1; i<=n; i++){

			for(int j = 1; j<=m; j++){

				if(j == 1) printf("%d ",ans[i][j]);

				else printf("%d ",ans[i][j]);

			}

			printf("\n");

		}

	}

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

int grid[105][105];

int main(){

	int n , m , k;

	cin>>n>>m>> k;

	vector<int>vi;

	for(int i= 0; i < k ; i++){

		int x ;cin>>x;

		vi.push_back(x);

	}

	int curr = 0 ,cnt = 0;

	for(int i =0 ; i < m ; i++){

		if(i%2==0){

			for(int j = 0; j < n ;j++){

				grid[j][i] = curr+1;

				cnt++;

				if(cnt == vi[curr]){

					curr++;

					cnt = 0;

				}

			}

		}else{

			for(int j = n-1 ; j >= 0; j--){

				grid[j][i] = curr+1;

				cnt++;

				if(cnt == vi[curr]){

					curr++;

					cnt = 0;

				}			

			}

		}

	}

	for(int i = 0; i < n; i++){

		for(int j = 0;j < m ;j++){

			cout<<grid[i][j]<<" ";

		}

		cout<<endl;

	}

	return 0;

}




// Faster C++ solution for the same problem (measured speedup: 5.251891603226246x):
#include<cstdio>

const int maxn = 110;

int tag[maxn*maxn];

int tmp[maxn*maxn];

int ans[maxn][maxn];

int main()

{

	int n,m;

	while(~scanf("%d%d",&n,&m)){

		int times,cnt = 1,change = 1;

		scanf("%d",&times);

		for(int i = 1; i <= times; i++){

			scanf("%d",&tag[i]);

			for(int j = 1; j<=tag[i]; j++){

				tmp[cnt] = i; cnt++;

			}

		}

		cnt = 1;

		for(int i = 1; i<=n; i++){

			if(change == 1){

				for(int j = 1; j<=m; j++){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}else {

				for(int j = m; j>=1; j--){

					ans[i][j] = tmp[cnt];

					cnt++;

				}

			}

			change = change * -1;

		}

		for(int i = 1; i<=n; i++){

			for(int j = 1; j<=m; j++){

				if(j == 1) printf("%d ",ans[i][j]);

				else printf("%d ",ans[i][j]);

			}

			printf("\n");

		}

	}

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');//在到达当前行最后一列前，每次空一格；到达后，换行；

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.1889054949144855x):
#include<stdio.h>  

   

int a[105][105],b[10000+50];  

   

int main ()  

{  

    int h,w;  

    while(scanf("%d %d",&h,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&b[i]);  

        for(i=0;i<h;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    a[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    a[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<h;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",a[i][j]);  

            printf("%d\n",a[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');//在到达当前行最后一列前，每次空一格；到达后，换行；

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.1889054949144855x):
 #include<stdio.h>  

int c[105][105],b[10050];  

int main ()  

{  

    int a,w;  

    while(scanf("%d %d",&a,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&b[i]);  

        for(i=0;i<a;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    c[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    c[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<a;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",c[i][j]);  

            printf("%d\n",c[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:


#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.1889054949144855x):
 #include<stdio.h>  

int c[105][105],b[10050];  

int main ()  

{  

    int a,w;  

    while(scanf("%d %d",&a,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&b[i]);  

        for(i=0;i<a;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    c[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    c[i][j]=k+1;  

                    b[k]--;  

                    if(b[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<a;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",c[i][j]);  

            printf("%d\n",c[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');//在到达当前行最后一列前，每次空一格；到达后，换行；

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.1889054949144855x):
#include<stdio.h>  

   

int x[105][105],y[10000+50];  

   

int main ()  

{  

    int h,w;  

    while(scanf("%d %d",&h,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&y[i]);  

        for(i=0;i<h;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<h;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",x[i][j]);  

            printf("%d\n",x[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:


#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.1889054949144855x):
#include<stdio.h>  

   

int x[105][105],y[10000+50];  

   

int main ()  

{  

    int h,w;  

    while(scanf("%d %d",&h,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&y[i]);  

        for(i=0;i<h;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<h;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",x[i][j]);  

            printf("%d\n",x[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:
#include<string>

#include<iostream>

#include<stdio.h>

#include<queue>

#include<ctime>

#include<vector>

#include<math.h>

#include<stack>

#include<map>

#include<vector>

#include<set>

#include<algorithm>

using namespace std;

int a[105][105], b[10010];

int main()

{

	int h, w;

	while (cin>>h>>w)

	{

		int i, j, t, m,k = 0;

		cin >> t;

		for (i = 0; i < t; i++)

			cin >> b[i];

		for (i = 0; i<h; i++)

		{

			if (i % 2 == 0)

				for (j = 0; j<w; j++)

				{

					a[i][j] = k + 1;

					b[k]--;

					if (b[k] == 0)

						k++;

				}

			if (i % 2 == 1)

				for (j = w - 1; j >= 0; j--)

				{

					a[i][j] = k + 1;

					b[k]--;

					if (b[k] == 0)

						k++;

				}

		}

		for (i = 0; i<h; i++)

		{

			for (j = 0; j < w - 1; j++)

				cout << a[i][j]<<" "; 

			cout << a[i][w - 1]<<endl;

		}

	}

}

// Faster C++ solution for the same problem (measured speedup: 5.21047022836839x):
#include<stdio.h>  

   

int x[105][105],y[10000+50];  

   

int main ()  

{  

    int h,w;  

    while(scanf("%d %d",&h,&w)!=EOF)  

    {  

        int i,j,t,k=0;  

        scanf("%d",&t);  

        for(i=0;i<t;i++)  

            scanf("%d",&y[i]);  

        for(i=0;i<h;i++)  

        {  

            if(i%2==0)  

                for(j=0;j<w;j++)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

            if(i%2==1)  

                for(j=w-1;j>=0;j--)  

                {  

                    x[i][j]=k+1;  

                    y[k]--;  

                    if(y[k]==0)  

                        k++;  

                }  

        }  

        for(i=0;i<h;i++)  

        {  

            for(j=0;j<w-1;j++)  

                printf("%d ",x[i][j]);  

            printf("%d\n",x[i][w-1]);  

        }  

    }  

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');//在到达当前行最后一列前，每次空一格；到达后，换行；

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.196475422008811x):
#include <cstdio>



int map[110][110];

int a[10010];

int plus[] = {1,-1};



int main()

{

	int h,w,n;

	scanf("%d%d",&h,&w);

	scanf("%d",&n);



	for (int i = 1; i<=n; i++)

		scanf("%d",&a[i]);



	int i = 1,j = 1;

	int k = 1;

	int t = 0;

	while (i<=h)

	{

		if (a[k]>0)

		{

			//printf("! %d %d",k,a[k]);

			a[k]--;

			map[i][j] = k;

			j += plus[t];

		}else k++;



		if (j>w || j<=0)

		{

			t = t==0?1:0;

			j += plus[t];

			i++;

		}

	}



	for (i = 1; i<=h; i++)

	{

		for (j = 1; j<=w; j++)

			printf("%d ",map[i][j]);

		printf("\n");

	}

}
// Slower C++ solution:


#include <bits/stdc++.h>

using namespace std;

int r,c;//行数、列数

int n;//颜色总数

int x,y;//当前待着色点坐标

int ans[200][200];//答案记录表



int main()

{

    cin>>r>>c>>n;//分别输入行数、列数、颜色总数

    x=1,y=1;//初始坐标设置为（1，1）

    for(int i=1; i<=n; i++)

    {

        int cnt;//“当前颜色剩余着色块数”计数器

        cin>>cnt;

        while(cnt--)//对当前颜色一块一块着色

        {

            ans[x][y]=i;//着色

            if(y==c&&x%2==1)//如果该点在右边缘 且 在奇数行上

                y=c,x++;//下移一行，列数不变

            else if(y==1&&x%2==0)//如果该点在第一列上，且在偶数行上

                y=1,x++;//列数不变，下移一行

            else if(x&1)//如果在奇数行上

                y++;//右移一列

            else//否则左移一列

                y--;

        }

    }

    for(int i=1; i<=r; i++)

        for(int j=1; j<=c; j++)

            printf("%d%c",ans[i][j],j==c?'\n':' ');

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.196475422008811x):
#include <cstdio>



int map[110][110];

int a[10010];

int plus[] = {1,-1};



int main()

{

	int h,w,n;

	scanf("%d%d",&h,&w);

	scanf("%d",&n);



	for (int i = 1; i<=n; i++)

		scanf("%d",&a[i]);



	int i = 1,j = 1;

	int k = 1;

	int t = 0;

	while (i<=h)

	{

		if (a[k]>0)

		{

			//printf("! %d %d",k,a[k]);

			a[k]--;

			map[i][j] = k;

			j += plus[t];

		}else k++;



		if (j>w || j<=0)

		{

			t = t==0?1:0;

			j += plus[t];

			i++;

		}

	}



	for (i = 1; i<=h; i++)

	{

		for (j = 1; j<=w; j++)

			printf("%d ",map[i][j]);

		printf("\n");

	}

}
// Slower C++ solution:
#include<string>

#include<iostream>

#include<stdio.h>

#include<queue>

#include<ctime>

#include<vector>

#include<math.h>

#include<stack>

#include<map>

#include<vector>

#include<set>

#include<algorithm>

using namespace std;

int a[105][105], b[10010];

int main()

{

	int h, w;

	while (cin>>h>>w)

	{

		int i, j, t, m,k = 0;

		cin >> t;

		for (i = 0; i < t; i++)

			cin >> b[i];

		for (i = 0; i<h; i++)

		{

			if (i % 2 == 0)

				for (j = 0; j<w; j++)

				{

					a[i][j] = k + 1;

					b[k]--;

					if (b[k] == 0)

						k++;

				}

			if (i % 2 == 1)

				for (j = w - 1; j >= 0; j--)

				{

					a[i][j] = k + 1;

					b[k]--;

					if (b[k] == 0)

						k++;

				}

		}

		for (i = 0; i<h; i++)

		{

			for (j = 0; j < w - 1; j++)

				cout << a[i][j]<<" "; 

			cout << a[i][w - 1]<<endl;

		}

	}

}

// Faster C++ solution for the same problem (measured speedup: 5.218071615557762x):
#include <cstdio>



int map[110][110];

int a[10010];

int plus[] = {1,-1};



int main()

{

	int h,w,n;

	scanf("%d%d",&h,&w);

	scanf("%d",&n);



	for (int i = 1; i<=n; i++)

		scanf("%d",&a[i]);



	int i = 1,j = 1;

	int k = 1;

	int t = 0;

	while (i<=h)

	{

		if (a[k]>0)

		{

			//printf("! %d %d",k,a[k]);

			a[k]--;

			map[i][j] = k;

			j += plus[t];

		}else k++;



		if (j>w || j<=0)

		{

			t = t==0?1:0;

			j += plus[t];

			i++;

		}

	}



	for (i = 1; i<=h; i++)

	{

		for (j = 1; j<=w; j++)

			printf("%d ",map[i][j]);

		printf("\n");

	}

}
// Slower C++ solution:
#include <bits/stdc++.h>

   

 using namespace std;

   

 #define MP make_pair

 #define PB push_back

 typedef long long LL;

 typedef pair<int,int> PII;

 const double eps=1e-8;

 const double pi=acos(-1.0);

 const int K=1e6+7;

 const int mod=1e9+7;

  

 int r,c,n,x,y,ans[200][200];

  

 int main(void)

 {

     scanf("%d%d%d",&r,&c,&n);

     x=1,y=1;

     for(int i=1,cnt;i<=n;i++)

     {

         scanf("%d",&cnt);

         while(cnt--)

         {

             ans[x][y]=i;

             if(y==c&&x%2==1)

                 y=c,x++;

             else if(y==1&&x%2==0)

                 y=1,x++;

             else if(x&1)

                 y++;

             else

                 y--;

         }

     }

     for(int i=1;i<=r;i++)

     for(int j=1;j<=c;j++)

         printf("%d%c",ans[i][j],j==c?'\n':' ');

     return 0;

 }


// Faster C++ solution for the same problem (measured speedup: 5.192031844666979x):
#include <cstdio>



int map[110][110];

int a[10010];

int plus[] = {1,-1};



int main()

{

	int h,w,n;

	scanf("%d%d",&h,&w);

	scanf("%d",&n);



	for (int i = 1; i<=n; i++)

		scanf("%d",&a[i]);



	int i = 1,j = 1;

	int k = 1;

	int t = 0;

	while (i<=h)

	{

		if (a[k]>0)

		{

			//printf("! %d %d",k,a[k]);

			a[k]--;

			map[i][j] = k;

			j += plus[t];

		}else k++;



		if (j>w || j<=0)

		{

			t = t==0?1:0;

			j += plus[t];

			i++;

		}

	}



	for (i = 1; i<=h; i++)

	{

		for (j = 1; j<=w; j++)

			printf("%d ",map[i][j]);

		printf("\n");

	}

}