#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct{
long* body;
int size;
}vlong;
typedef struct{
int* body;
int size;
}vint;
typedef struct{
long m,n;
vlong* ind;
vint* val;
}matr;
vlong* vl_create(){
vlong
* v
= (vlong
*) malloc(sizeof(vlong
)); v -> size = 0;
v -> body = NULL;
}
void vl_destroy(vlong* v){
}
int vl_get_size(vlong* v){
return v -> size;
}
long vl_get(vlong* v, int i){
return v -> body[i];
}
void vl_set(vlong* v, int i, long val){
v -> body[i] = val;
}
bool vl_set_size(vlong* v, int size){
long* body1
= (long*) realloc(v
-> body
,size
* sizeof(long)); if (body1 == NULL && size != 0){
return false;
}
for (int i = v -> size; i < size; i ++){
body1[i] = 0;
}
v -> body = body1;
v -> size = size;
return true;
}
bool vl_push(vlong* v, long val){
int new_size = vl_get_size(v) + 1;
if (!vl_set_size(v, new_size)){
return false;
}
vl_set(v, new_size - 1, val);
return true;
}
vint* vi_create(){
vint
* v
= (vint
*) malloc(sizeof(vint
)); v -> size = 0;
v -> body = NULL;
}
void vi_destroy(vint* v){
}
int vi_get_size(vint* v){
return v -> size;
}
int vi_get(vint* v, int i){
return v -> body[i];
}
void vi_set(vint* v, int i, int val){
v -> body[i] = val;
}
bool vi_set_size(vint* v, int size){
int* body1
= (int*) realloc(v
-> body
,size
* sizeof(int)); if (body1 == NULL && size != 0){
return false;
}
for (int i = v -> size; i < size; i ++){
body1[i] = 0;
}
v -> body = body1;
v -> size = size;
return true;
}
bool vi_push(vint* v, int val){
int new_size = vi_get_size(v) + 1;
if (!vi_set_size(v, new_size)){
return false;
}
vi_set(v, new_size - 1, val);
return true;
}
matr* m_create(int m, int n){
matr
* mat
= (matr
*) malloc(sizeof(matr
)); mat -> m = m;
mat -> n = n;
mat -> ind = vl_create();
mat -> val = vi_create();
return mat;
}
void m_destroy(matr* m){
vl_destroy(m -> ind);
vi_destroy(m -> val);
}
matr* m_read1(){
int n,m;
int i, j;
matr* mat = m_create(m, n);
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j ++){
int val;
if (val != 0){
vl_push(mat -> ind, mat -> n * i + j);
vi_push(mat -> val, val);
}
}
j = 0;
}
return mat;
}
matr* m_read2(int m, int n){
int i, j;
matr* mat = m_create(m, n);
for (int i = 0; i < m; i ++){
for (int j = 0; j < n; j ++){
int val;
if (val != 0){
vl_push(mat -> ind, mat -> n * i + j);
vi_push(mat -> val, val);
}
}
j = 0;
}
return mat;
}
void m_print(matr* mat){
int now = 0;
int i, j;
for (int i = 0; i < mat -> m; i ++){
for (int j = 0; i < mat -> n; j ++){
if (mat -> ind -> body [now] == mat -> n * i + j && now < vl_get_size(mat -> ind)){
printf("%d", mat
-> val
-> body
[now
]); now ++;
}else{
}
}
j = 0;
}
}
int main(){
printf("Enter size and matrix \n"); matr* mat = m_read1();
printf("Enter a column with size %d * 1 \n", mat
-> n
); matr* st = m_read2(mat -> n, 1);
m_print(mat);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkYm9vbC5oPgojaW5jbHVkZTxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0ewoJbG9uZyogYm9keTsKCWludCBzaXplOwp9dmxvbmc7Cgp0eXBlZGVmIHN0cnVjdHsKCWludCogYm9keTsKCWludCBzaXplOwp9dmludDsKCnR5cGVkZWYgc3RydWN0ewoJbG9uZyBtLG47Cgl2bG9uZyogaW5kOwoJdmludCogdmFsOwp9bWF0cjsKCnZsb25nKiB2bF9jcmVhdGUoKXsKCXZsb25nKiB2ID0gKHZsb25nKikgbWFsbG9jKHNpemVvZih2bG9uZykpOwoJdiAtPiBzaXplID0gMDsKCXYgLT4gYm9keSA9IE5VTEw7Cn0KCnZvaWQgdmxfZGVzdHJveSh2bG9uZyogdil7CglmcmVlKHYgLT4gYm9keSk7CglmcmVlKHYpOwp9CgppbnQgdmxfZ2V0X3NpemUodmxvbmcqIHYpewoJcmV0dXJuIHYgLT4gc2l6ZTsKfQoKbG9uZyB2bF9nZXQodmxvbmcqIHYsIGludCBpKXsKCXJldHVybiB2IC0+IGJvZHlbaV07Cn0KCnZvaWQgdmxfc2V0KHZsb25nKiB2LCBpbnQgaSwgbG9uZyB2YWwpewoJdiAtPiBib2R5W2ldID0gdmFsOwp9Cgpib29sIHZsX3NldF9zaXplKHZsb25nKiB2LCBpbnQgc2l6ZSl7Cglsb25nKiBib2R5MSA9IChsb25nKikgcmVhbGxvYyh2IC0+IGJvZHksc2l6ZSogc2l6ZW9mKGxvbmcpKTsKCWlmIChib2R5MSA9PSBOVUxMICYmIHNpemUgIT0gMCl7CgkJcmV0dXJuIGZhbHNlOwoJfQoJZm9yIChpbnQgaSA9IHYgLT4gc2l6ZTsgaSA8IHNpemU7IGkgKyspewoJCWJvZHkxW2ldID0gMDsKCX0KCXYgLT4gYm9keSA9IGJvZHkxOwoJdiAtPiBzaXplID0gc2l6ZTsKCXJldHVybiB0cnVlOwp9Cgpib29sIHZsX3B1c2godmxvbmcqIHYsIGxvbmcgdmFsKXsKCWludCBuZXdfc2l6ZSA9IHZsX2dldF9zaXplKHYpICsgMTsKCWlmICghdmxfc2V0X3NpemUodiwgbmV3X3NpemUpKXsKCQlyZXR1cm4gZmFsc2U7Cgl9Cgl2bF9zZXQodiwgbmV3X3NpemUgLSAxLCB2YWwpOwogICAgcmV0dXJuIHRydWU7Cn0KCnZpbnQqIHZpX2NyZWF0ZSgpewoJdmludCogdiA9ICh2aW50KikgbWFsbG9jKHNpemVvZih2aW50KSk7Cgl2IC0+IHNpemUgPSAwOwoJdiAtPiBib2R5ID0gTlVMTDsKfQoKdm9pZCB2aV9kZXN0cm95KHZpbnQqIHYpewoJZnJlZSh2IC0+IGJvZHkpOwoJZnJlZSh2KTsKfQoKaW50IHZpX2dldF9zaXplKHZpbnQqIHYpewoJcmV0dXJuIHYgLT4gc2l6ZTsKfQoKaW50IHZpX2dldCh2aW50KiB2LCBpbnQgaSl7CglyZXR1cm4gdiAtPiBib2R5W2ldOwp9Cgp2b2lkIHZpX3NldCh2aW50KiB2LCBpbnQgaSwgaW50IHZhbCl7Cgl2IC0+IGJvZHlbaV0gPSB2YWw7Cn0KCmJvb2wgdmlfc2V0X3NpemUodmludCogdiwgaW50IHNpemUpewoJaW50KiBib2R5MSA9IChpbnQqKSByZWFsbG9jKHYgLT4gYm9keSxzaXplKiBzaXplb2YoaW50KSk7CglpZiAoYm9keTEgPT0gTlVMTCAmJiBzaXplICE9IDApewoJCXJldHVybiBmYWxzZTsKCX0KCWZvciAoaW50IGkgPSB2IC0+IHNpemU7IGkgPCBzaXplOyBpICsrKXsKCQlib2R5MVtpXSA9IDA7Cgl9Cgl2IC0+IGJvZHkgPSBib2R5MTsKCXYgLT4gc2l6ZSA9IHNpemU7CglyZXR1cm4gdHJ1ZTsKfQoKYm9vbCB2aV9wdXNoKHZpbnQqIHYsIGludCB2YWwpewoJaW50IG5ld19zaXplID0gdmlfZ2V0X3NpemUodikgKyAxOwoJaWYgKCF2aV9zZXRfc2l6ZSh2LCBuZXdfc2l6ZSkpewoJCXJldHVybiBmYWxzZTsKCX0KCXZpX3NldCh2LCBuZXdfc2l6ZSAtIDEsIHZhbCk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKbWF0ciogbV9jcmVhdGUoaW50IG0sIGludCBuKXsKCW1hdHIqIG1hdCA9IChtYXRyKikgbWFsbG9jKHNpemVvZihtYXRyKSk7CgltYXQgLT4gbSA9IG07CgltYXQgLT4gbiA9IG47CgltYXQgLT4gaW5kID0gdmxfY3JlYXRlKCk7CgltYXQgLT4gdmFsID0gdmlfY3JlYXRlKCk7CglyZXR1cm4gbWF0Owp9Cgp2b2lkIG1fZGVzdHJveShtYXRyKiBtKXsKCXZsX2Rlc3Ryb3kobSAtPiBpbmQpOwoJdmlfZGVzdHJveShtIC0+IHZhbCk7CglmcmVlKG0pOwp9CgptYXRyKiBtX3JlYWQxKCl7CglpbnQgbixtOwoJaW50IGksIGo7CglzY2FuZigiJWQlZCIsICZtLCAmbik7CgltYXRyKiBtYXQgPSBtX2NyZWF0ZShtLCBuKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSArKyl7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqICsrKXsKCQkJaW50IHZhbDsKCQkJc2NhbmYoIiVkIiwgJnZhbCk7CgkJCWlmICh2YWwgIT0gMCl7CgkJCQl2bF9wdXNoKG1hdCAtPiBpbmQsIG1hdCAtPiBuICogaSArIGopOwoJCQkJdmlfcHVzaChtYXQgLT4gdmFsLCB2YWwpOwoJCQl9CgkJfQoJCWogPSAwOwoJfQoJcmV0dXJuIG1hdDsKfQoKbWF0ciogbV9yZWFkMihpbnQgbSwgaW50IG4pewoJaW50IGksIGo7CgltYXRyKiBtYXQgPSBtX2NyZWF0ZShtLCBuKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSArKyl7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqICsrKXsKCQkJaW50IHZhbDsKCQkJc2NhbmYoIiVkIiwgJnZhbCk7CgkJCWlmICh2YWwgIT0gMCl7CgkJCQl2bF9wdXNoKG1hdCAtPiBpbmQsIG1hdCAtPiBuICogaSArIGopOwoJCQkJdmlfcHVzaChtYXQgLT4gdmFsLCB2YWwpOwoJCQl9CgkJfQoJCWogPSAwOwoJfQoJcmV0dXJuIG1hdDsKfQoKdm9pZCBtX3ByaW50KG1hdHIqIG1hdCl7CglpbnQgbm93ID0gMDsKCWludCBpLCBqOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXQgLT4gbTsgaSArKyl7CgkJZm9yIChpbnQgaiA9IDA7IGkgPCBtYXQgLT4gbjsgaiArKyl7CgkJCWlmIChtYXQgLT4gaW5kIC0+IGJvZHkgW25vd10gPT0gbWF0IC0+IG4gKiBpICsgaiAmJiBub3cgPCB2bF9nZXRfc2l6ZShtYXQgLT4gaW5kKSl7CgkJCQlwcmludGYoIiVkIiwgbWF0IC0+IHZhbCAtPiBib2R5W25vd10pOwoJCQkJbm93ICsrOwoJCQl9ZWxzZXsKCQkJCXByaW50ZigiMCIpOwoJCQl9CgkJfQoJICAgIGogPSAwOwoJICAgIHByaW50ZigiXG4iKTsKCgl9CglwcmludGYoIlxuIik7Cn0KCmludCBtYWluKCl7CglwcmludGYoIkVudGVyIHNpemUgYW5kIG1hdHJpeCBcbiIpOwoJbWF0ciogbWF0ID0gbV9yZWFkMSgpOwoJcHJpbnRmKCJFbnRlciBhIGNvbHVtbiB3aXRoIHNpemUgJWQgKiAxIFxuIiwgbWF0IC0+IG4pOwoJbWF0ciogc3QgPSBtX3JlYWQyKG1hdCAtPiBuLCAxKTsKCW1fcHJpbnQobWF0KTsKCXJldHVybiAwOwp9