#include <stdio.h>
#include <algorithm>
namespace algo
{
template <typename it_t, typename d_it_t>
constexpr auto copy(it_t first, it_t last, d_it_t dfirst)
{
while(first != last)
{
*dfirst++ = *first++;
}
}
template <typename it_t, typename value_t>
constexpr auto fill(it_t first, it_t last, const value_t& value)
{
while(first != last)
{
*first++ = value;
}
}
}
template <typename ty, size_t n>
class array
{
public:
constexpr auto begin()
{
return m_arr;
}
constexpr auto end()
{
return m_arr + n;
}
constexpr auto begin() const
{
return m_arr;
}
constexpr auto end() const
{
return m_arr + n;
}
constexpr auto& operator[](size_t i)
{
return m_arr[i];
}
constexpr const auto& operator[](size_t i) const
{
return m_arr[i];
}
constexpr auto& operator=(const array& rhs)
{
algo::copy(rhs.begin(), rhs.end(), begin());
return *this;
}
private:
ty m_arr[n]{};
};
template <size_t a, size_t b>
class trapeze
{
public:
constexpr trapeze()
{
algo::fill(m_data.begin(), m_data.end(), ' ');
m_data[a*b] = '\0';
}
constexpr auto& operator()(size_t i, size_t j)
{
return m_data[i*b + j];
}
constexpr auto data() const
{
return m_data.begin();
}
private:
array<char, a * b + 1u> m_data; //+1 for '\0'
};
template <size_t max_a, size_t max_b>
using trapeze_t = trapeze<std::max(max_a, max_b), std::max(max_a, max_b) + 1u>; //+1 for '\n'
template <size_t max_a, size_t max_b>
constexpr auto generate_trapeze(size_t a, size_t b)
{
trapeze_t<max_a, max_b> trapeze;
if(a <= b)
{
for(size_t i = a; i <= b; i++) {
for(size_t j = 0; j < i ;j++) {
trapeze(i - a, j) = '*';
}
trapeze(i - a, max_b) = '\n';
}
}
else
{
for(size_t i = a; static_cast<int>(i) >= static_cast<int>(b); --i) {
for(size_t j = 0; j < i; j++) {
trapeze(a - i, j) = '*';
}
trapeze(a - i, max_b) = '\n';
}
}
return trapeze;
}
template <size_t a, size_t b>
constexpr auto generate()
{
constexpr auto max_a = a + 1u;
constexpr auto max_b = b + 1u;
using generated_trapezes_row_t = array<trapeze_t<max_a, max_b>, max_b>;
using generated_trapezes_t = array<generated_trapezes_row_t, max_a>;
generated_trapezes_t generated_trapezes;
for(size_t i = 0u; i < max_a; ++i)
{
for(size_t j = 0u; j < max_b; ++j)
{
generated_trapezes[i][j] = generate_trapeze<max_a, max_b>(i, j);
}
}
return generated_trapezes;
}
int main()
{
constexpr auto max_a{ 10u };
constexpr auto max_b{ 10u };
constexpr auto trapezes = generate<max_a, max_b>();
size_t a, b;
scanf("%lu %lu", &a, &b);
printf("%s", trapezes[a][b].data());
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+CgpuYW1lc3BhY2UgYWxnbwp7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgaXRfdCwgdHlwZW5hbWUgZF9pdF90PgogICAgY29uc3RleHByIGF1dG8gY29weShpdF90IGZpcnN0LCBpdF90IGxhc3QsIGRfaXRfdCBkZmlyc3QpCiAgICB7CiAgICAgICAgd2hpbGUoZmlyc3QgIT0gbGFzdCkKICAgICAgICB7CiAgICAgICAgICAgICpkZmlyc3QrKyA9ICpmaXJzdCsrOwogICAgICAgIH0KICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgaXRfdCwgdHlwZW5hbWUgdmFsdWVfdD4KICAgIGNvbnN0ZXhwciBhdXRvIGZpbGwoaXRfdCBmaXJzdCwgaXRfdCBsYXN0LCBjb25zdCB2YWx1ZV90JiB2YWx1ZSkKICAgIHsKICAgICAgICB3aGlsZShmaXJzdCAhPSBsYXN0KQogICAgICAgIHsKICAgICAgICAgICAgKmZpcnN0KysgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSB0eSwgc2l6ZV90IG4+CmNsYXNzIGFycmF5CnsKcHVibGljOgogICAgY29uc3RleHByIGF1dG8gYmVnaW4oKQogICAgewogICAgICAgIHJldHVybiBtX2FycjsKICAgIH0KCiAgICBjb25zdGV4cHIgYXV0byBlbmQoKQogICAgewogICAgICAgIHJldHVybiBtX2FyciArIG47CiAgICB9CgogICAgY29uc3RleHByIGF1dG8gYmVnaW4oKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBtX2FycjsKICAgIH0KCiAgICBjb25zdGV4cHIgYXV0byBlbmQoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBtX2FyciArIG47CiAgICB9CgogICAgY29uc3RleHByIGF1dG8mIG9wZXJhdG9yW10oc2l6ZV90IGkpCiAgICB7CiAgICAgICAgcmV0dXJuIG1fYXJyW2ldOwogICAgfQoKICAgIGNvbnN0ZXhwciBjb25zdCBhdXRvJiBvcGVyYXRvcltdKHNpemVfdCBpKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBtX2FycltpXTsKICAgIH0KCiAgICBjb25zdGV4cHIgYXV0byYgb3BlcmF0b3I9KGNvbnN0IGFycmF5JiByaHMpCiAgICB7CiAgICAgICAgYWxnbzo6Y29weShyaHMuYmVnaW4oKSwgcmhzLmVuZCgpLCBiZWdpbigpKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cgpwcml2YXRlOgogICAgdHkgbV9hcnJbbl17fTsKfTsKCgp0ZW1wbGF0ZSA8c2l6ZV90IGEsIHNpemVfdCBiPgpjbGFzcyB0cmFwZXplCnsKcHVibGljOgogICAgY29uc3RleHByIHRyYXBlemUoKQogICAgewogICAgICAgIGFsZ286OmZpbGwobV9kYXRhLmJlZ2luKCksIG1fZGF0YS5lbmQoKSwgJyAnKTsKICAgICAgICBtX2RhdGFbYSpiXSA9ICdcMCc7CiAgICB9CgogICAgY29uc3RleHByIGF1dG8mIG9wZXJhdG9yKCkoc2l6ZV90IGksIHNpemVfdCBqKQogICAgewogICAgICAgIHJldHVybiBtX2RhdGFbaSpiICsgal07CiAgICB9CgogICAgY29uc3RleHByIGF1dG8gZGF0YSgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIG1fZGF0YS5iZWdpbigpOwogICAgfQoKcHJpdmF0ZToKICAgIGFycmF5PGNoYXIsIGEgKiBiICsgMXU+IG1fZGF0YTsgLy8rMSBmb3IgJ1wwJwp9OwoKCnRlbXBsYXRlIDxzaXplX3QgbWF4X2EsIHNpemVfdCBtYXhfYj4KdXNpbmcgdHJhcGV6ZV90ID0gdHJhcGV6ZTxzdGQ6Om1heChtYXhfYSwgbWF4X2IpLCBzdGQ6Om1heChtYXhfYSwgbWF4X2IpICsgMXU+OyAvLysxIGZvciAnXG4nCgp0ZW1wbGF0ZSA8c2l6ZV90IG1heF9hLCBzaXplX3QgbWF4X2I+CmNvbnN0ZXhwciBhdXRvIGdlbmVyYXRlX3RyYXBlemUoc2l6ZV90IGEsIHNpemVfdCBiKQp7CiAgICB0cmFwZXplX3Q8bWF4X2EsIG1heF9iPiB0cmFwZXplOwogICAgCiAgICBpZihhIDw9IGIpCiAgICB7CiAgICAgICAgZm9yKHNpemVfdCBpID0gYTsgaSA8PSBiOyBpKyspIHsKICAgICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGkgO2orKykgewogICAgICAgICAgICAgICAgdHJhcGV6ZShpIC0gYSwgaikgPSAnKic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJhcGV6ZShpIC0gYSwgbWF4X2IpID0gJ1xuJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yKHNpemVfdCBpID0gYTsgc3RhdGljX2Nhc3Q8aW50PihpKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KGIpOyAtLWkpIHsKICAgICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgICAgICAgICAgdHJhcGV6ZShhIC0gaSwgaikgPSAnKic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJhcGV6ZShhIC0gaSwgbWF4X2IpID0gJ1xuJzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRyYXBlemU7Cn0KCnRlbXBsYXRlIDxzaXplX3QgYSwgc2l6ZV90IGI+CmNvbnN0ZXhwciBhdXRvIGdlbmVyYXRlKCkKewogICAgY29uc3RleHByIGF1dG8gbWF4X2EgPSBhICsgMXU7CiAgICBjb25zdGV4cHIgYXV0byBtYXhfYiA9IGIgKyAxdTsKICAgIHVzaW5nIGdlbmVyYXRlZF90cmFwZXplc19yb3dfdCA9IGFycmF5PHRyYXBlemVfdDxtYXhfYSwgbWF4X2I+LCBtYXhfYj47CiAgICB1c2luZyBnZW5lcmF0ZWRfdHJhcGV6ZXNfdCA9IGFycmF5PGdlbmVyYXRlZF90cmFwZXplc19yb3dfdCwgbWF4X2E+OwoKICAgIGdlbmVyYXRlZF90cmFwZXplc190IGdlbmVyYXRlZF90cmFwZXplczsKCiAgICBmb3Ioc2l6ZV90IGkgPSAwdTsgaSA8IG1heF9hOyArK2kpCiAgICB7CiAgICAgICAgZm9yKHNpemVfdCBqID0gMHU7IGogPCBtYXhfYjsgKytqKQogICAgICAgIHsKICAgICAgICAgICAgZ2VuZXJhdGVkX3RyYXBlemVzW2ldW2pdID0gZ2VuZXJhdGVfdHJhcGV6ZTxtYXhfYSwgbWF4X2I+KGksIGopOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZ2VuZXJhdGVkX3RyYXBlemVzOwp9CgppbnQgbWFpbigpCnsKICAgIGNvbnN0ZXhwciBhdXRvIG1heF9heyAxMHUgfTsKICAgIGNvbnN0ZXhwciBhdXRvIG1heF9ieyAxMHUgfTsKICAgIGNvbnN0ZXhwciBhdXRvIHRyYXBlemVzID0gZ2VuZXJhdGU8bWF4X2EsIG1heF9iPigpOwoKICAgIHNpemVfdCBhLCBiOwoKICAgIHNjYW5mKCIlbHUgJWx1IiwgJmEsICZiKTsgICAgCgogICAgcHJpbnRmKCIlcyIsIHRyYXBlemVzW2FdW2JdLmRhdGEoKSk7Cn0K