stablegradients/pie-gem5-pairs huggingface dataset:
// 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.199556544250154x):
#include<cstdio>

int p[100 + 10][100 + 10];

int a[10000 + 10];

int h, w, n;



int main() {

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

	for (int i = 1;i <= n;i++)scanf("%d", &a[i]);

	int i = 1, j = 1, t = h*w, k = 1;

	while (t--) {

		p[i][j] = k;

		a[k]--;

		if (!a[k])k++;

		if (j & 1) {

			if (i == h)j++;

			else i++;

		}

		else {

			if (i == 1)j++;

			else i--;

		}

	}

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

		for (int j = 1;j < w;j++)printf("%d ", p[i][j]);

		printf("%d\n", p[i][w]);

	}

	for (int j = 1;j < w;j++)printf("%d ", p[h][j]);

	printf("%d", p[h][w]);

	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.199556544250154x):
#include<cstdio>

int p[100 + 10][100 + 10];

int a[10000 + 10];

int h, w, n;



int main() {

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

	for (int i = 1;i <= n;i++)scanf("%d", &a[i]);

	int i = 1, j = 1, t = h*w, k = 1;

	while (t--) {

		p[i][j] = k;

		a[k]--;

		if (!a[k])k++;

		if (j & 1) {

			if (i == h)j++;

			else i++;

		}

		else {

			if (i == 1)j++;

			else i--;

		}

	}

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

		for (int j = 1;j < w;j++)printf("%d ", p[i][j]);

		printf("%d\n", p[i][w]);

	}

	for (int j = 1;j < w;j++)printf("%d ", p[h][j]);

	printf("%d", p[h][w]);

	return 0;

}
// 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.221165542730691x):
#include<cstdio>

int p[100 + 10][100 + 10];

int a[10000 + 10];

int h, w, n;



int main() {

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

	for (int i = 1;i <= n;i++)scanf("%d", &a[i]);

	int i = 1, j = 1, t = h*w, k = 1;

	while (t--) {

		p[i][j] = k;

		a[k]--;

		if (!a[k])k++;

		if (j & 1) {

			if (i == h)j++;

			else i++;

		}

		else {

			if (i == 1)j++;

			else i--;

		}

	}

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

		for (int j = 1;j < w;j++)printf("%d ", p[i][j]);

		printf("%d\n", p[i][w]);

	}

	for (int j = 1;j < w;j++)printf("%d ", p[h][j]);

	printf("%d", p[h][w]);

	return 0;

}
// 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.195110332198471x):
#include<cstdio>

int p[100 + 10][100 + 10];

int a[10000 + 10];

int h, w, n;



int main() {

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

	for (int i = 1;i <= n;i++)scanf("%d", &a[i]);

	int i = 1, j = 1, t = h*w, k = 1;

	while (t--) {

		p[i][j] = k;

		a[k]--;

		if (!a[k])k++;

		if (j & 1) {

			if (i == h)j++;

			else i++;

		}

		else {

			if (i == 1)j++;

			else i--;

		}

	}

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

		for (int j = 1;j < w;j++)printf("%d ", p[i][j]);

		printf("%d\n", p[i][w]);

	}

	for (int j = 1;j < w;j++)printf("%d ", p[h][j]);

	printf("%d", p[h][w]);

	return 0;

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

using namespace std;

int h,l;

int sumn;

int x,y;

int answer[200][200];



int main()

{

    cin>>h>>l>>sumn;

    x=1,y=1;

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

    {

        int count;

        cin>>count;

        while(count--)

        {

            answer[x][y]=i;

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

                {y=l;x++;}

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

                {y=1;x++;}

            else if(x&1)

                y++;

            else

                y--;

        }

    }

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

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

            {

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

        	}

    return 0;

}

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

int p[100 + 10][100 + 10];

int a[10000 + 10];

int h, w, n;



int main() {

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

	for (int i = 1;i <= n;i++)scanf("%d", &a[i]);

	int i = 1, j = 1, t = h*w, k = 1;

	while (t--) {

		p[i][j] = k;

		a[k]--;

		if (!a[k])k++;

		if (j & 1) {

			if (i == h)j++;

			else i++;

		}

		else {

			if (i == 1)j++;

			else i--;

		}

	}

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

		for (int j = 1;j < w;j++)printf("%d ", p[i][j]);

		printf("%d\n", p[i][w]);

	}

	for (int j = 1;j < w;j++)printf("%d ", p[h][j]);

	printf("%d", p[h][w]);

	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.19246106508187x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				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.19246106508187x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

}
// 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.214040575240229x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

}
// 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.188020920471656x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

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

using namespace std;

int h,l;

int sumn;

int x,y;

int answer[200][200];



int main()

{

    cin>>h>>l>>sumn;

    x=1,y=1;

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

    {

        int count;

        cin>>count;

        while(count--)

        {

            answer[x][y]=i;

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

                {y=l;x++;}

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

                {y=1;x++;}

            else if(x&1)

                y++;

            else

                y--;

        }

    }

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

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

            {

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

        	}

    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 5.19246106508187x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

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

#include<cstdio>

using namespace std;



int dx[4]={1,-1,0,0};



int h,w,n;

int cnt;

int a[100005];

int ans[105][105];



void dfs(int x,int y,int l,int f){

	ans[x][y]=a[l];

//	cout<<x<<" "<<y<<" "<<l<<endl;

	if(l==h*w)return;

	int xx=x+dx[f];

	if(xx<=h&&xx>0)dfs(xx,y,l+1,f);else dfs(x,y+1,l+1,f^1);

}



int main(){

	cin>>h>>w>>n;

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

		int x;

		cin>>x;

		while(x--){

			a[++cnt]=i;

		}

	}

	dfs(1,1,1,0);

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

		for(int j=1;j<=w;j++)cout<<ans[i][j]<<" ";

		cout<<endl;

	}

}

// Faster C++ solution for the same problem (measured speedup: 5.210941784932314x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

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

using namespace std ;

const int maxn = 1e4 + 10 ;

int a[maxn] , n , w , h , mat[110][100];

int main()

{

	ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;

	cin >>h >> w >>  n ;

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

		cin >> a[i] ;

	int x = 1 ;

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

	{

		if ( i%2 == 1 ) 

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

			{

				//cout << x <<" " << a[x] << endl;

				if ( a[x] ) 

					mat[i][j] = x, a[x]-- ;

				else x++ , mat[i][j] = x , a[x] -- ;



			}

		else

		{

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

			{

				//cout << x << " " << a[x] << endl;

				if (a[x] )

					mat[i][j] = x , a[x]--;

				else

					x++ , mat[i][j] = x , a[x] -- ;

			}

		}

	}

	//cout << " **** " << endl;

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

	{

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

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

		cout << "\n" ;

	}	



}


// Faster C++ solution for the same problem (measured speedup: 5.2761793224851425x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

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

using namespace std;



int main(){

	int h,w;

	cin>>h>>w;

	int n;

	cin>>n;

	int a[n];

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

		cin>>a[i];

	}

	vector<int>vc[h];

	int ans=1;

	int i=0;

	while(i<h){

		if(a[ans-1]==0){

			ans++;

		}

		else{

			vc[i].push_back(ans);

			a[ans-1]--;

		}

		if(vc[i].size()==w){

			i++;

		}

	}

	int jvb=0;

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

		if(jvb%2==0){

			for(int k=0;k<vc[j].size();k++){

				cout<<vc[j][k]<<" ";

			}

		}

		else{

			for(int k=vc[j].size()-1;k>=0;k--){

				cout<<vc[j][k]<<" ";

			}

		}

		jvb++;

		cout<<endl;

	}

}

// Faster C++ solution for the same problem (measured speedup: 5.264956755144647x):
//蛇形填数



#include<stdio.h>



int main(){

	int H,W,N;int num[10001];int ans[100][100];

	scanf("%d%d",&H,&W);

	scanf("%d",&N);

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

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

	}

	int hs=0,he=H-1,ws=0,we=W-1;

	int nowh=0,noww=0;

	bool flagr=true,flagd=false,flagl=false,flagt=false;

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

		while(num[i]--){

			if(flagr){

				ans[nowh][noww++]=i;

				if(noww>we){

					flagr=false;

					noww=we;

					nowh++;

					hs++;

					flagd=true;

				}

			}

			else if(flagd){

				ans[nowh++][noww]=i;

				if(nowh>he){

					flagd=false;

					nowh=he;

					noww--;

					we--;

					flagl=true;

				}

			}

			else if(flagl){

				ans[nowh][noww--]=i;

				if(noww<ws){

					flagl=false;

					noww=ws;

					nowh--;

					he--;

					flagt=true;

				}

			}

			else if(flagt){

				ans[nowh--][noww]=i;

				if(nowh<hs){

					flagt=false;

					nowh=hs;

					noww++;

					ws++;

					flagr=true;

				}

			}

		}

	}

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

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

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

			if(j!=W-1)

				printf(" ");

			else

				printf("\n"); 

		}

	}

	return 0;

}