Problem:
Score : 700 points

Problem Statement

Determine if there exists a sequence obtained by permuting 1,2,...,N that satisfies the following conditions:

The length of its longest increasing subsequence is A.

The length of its longest decreasing subsequence is B.

If it exists, construct one such sequence.

Notes

A subsequence of a sequence P is a sequence that can be obtained by extracting some of the elements in P without changing the order.

A longest increasing subsequence of a sequence P is a sequence with the maximum length among the subsequences of P that are monotonically increasing.

Similarly, a longest decreasing subsequence of a sequence P is a sequence with the maximum length among the subsequences of P that are monotonically decreasing.

Constraints

1 \leq N,A,B \leq 3\times 10^5

All input values are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

If there are no sequences that satisfy the conditions, print -1.

Otherwise, print N integers. The i-th integer should be the i-th element of the sequence that you constructed.

Sample Input 1

5 3 2

Sample Output 1

2 4 1 5 3

One longest increasing subsequence of this sequence is {2,4,5}, and one longest decreasing subsequence of it is {4,3}.

Sample Input 2

7 7 1

Sample Output 2

1 2 3 4 5 6 7

Sample Input 3

300000 300000 300000

Sample Output 3

-1

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <cmath>
using namespace std;
typedef long long i64;
typedef long double ld;
typedef pair<i64,i64> P;
#define rep(i,s,e) for(int i = (s);i <= (e);i++)

int n;
int a;
int b;

int main(){
	cin >> n >> a >> b;
	if(a * b < n || a + b - 1 > n){
		cout << -1 << endl;
		return 0;
	}

	swap(a,b);

	vector<int> ans;
	vector<int> mark;
	for(int i = 1;i <= b;i++){
		for(int j = i * a;j > (i - 1) * a;j--){
			ans.push_back(j);
			if(i == 1 || j == (i * a)){
				mark.push_back(1);
			}
			else{
				mark.push_back(0);
			}
		}
	}
	priority_queue<int> que;
	int remain = ans.size() - n;
	for(int i = 0;i < ans.size() && remain > 0;i++){
		if(mark[i] == 0){
			remain--;
			mark[i] = -1;
			que.push(ans[i]);
		}
	}

	for(int i = 0;i < ans.size();i++){
		if(mark[i] != -1){
			if(ans[i] > n){
				ans[i] = que.top();
				que.pop();
			}
			cout << ans[i] << " ";
		}
	}
	cout << endl;

}