Input Format
First line of the input contains a single integer  blocks follow, each describing a town.
Every town block contains several lines. On the first line there is a string  - the name of the town. On the second line there is an integer  - the number of the offices in the town.  blocks follow then, each describing an office.
Every office block also contains several lines. On the first line there are three integers separated by single spaces:  (the number of packages in the office),  and  (described above).  blocks follow, each describing a package.
Every package block contains exactly two lines. On the first line there is a string  which is an id of the package. On the second line there is an integer  which is the weight of the package.
Then, there is a single integer  on the line which is the number of queries.  blocks follow, each describing a query.
Every query block contains several lines. On the first line there is an integer  or . If this integer is , on the second line there is a string  - the name of town for which all packages should be printed. If this integer is , on the second line there are string , integer , string  and integer  separated by single spaces. That means transactions between post office # in the town  and post office # in the town  should be processed.
If the integer is , no lines follow and the town with the most number of packages should be found.
Constraints
  • All integer are between  and 
  • .
  • All strings have length 
  • All towns' names have only uppercase english letters and are unique.
  • All packages' ids have only lowercase english letters and are unique.
  • For each post office,   .
  • All queries are valid, that means, towns with the given names always exist, post offices with the given indices always exist.
Output Format
For queries of type , print all packages in the format provided in the problem statement. For queries of type , print "Town with the most number of packages is " on a separate line.

hackerrank post transition problem solution in c programming

Post Transition problem solution in c programming | HackerRank

#include <stdio.h>
#include <stdlib.h>
#define MAX_STRING_LENGTH 6
struct package
{
    char* id;
    int weight;
};
typedef struct package package;
struct post_office
{
    int min_weight;
    int max_weight;
    package* packages;
    int packages_count;
};
typedef struct post_office post_office;
struct town
{
    char* name;
    post_office* offices;
    int offices_count;
};
typedef struct town town;
void print_all_packages(town t) {
    printf("%s:\n", t.name);
    for (int i = 0; i < t.offices_count; i++) {
        printf("\t%d:\n", i);
        for (int j = 0; j < t.offices[i].packages_count; j++) {
            printf("\t\t%s\n", t.offices[i].packages[j].id);
        }
    }
}
int is_movable(post_office po, int w) {
    if (w >= po.min_weight && w <= po.max_weight)
        return 1;
    else
        return 0;
}
void send_all_acceptable_packages(town *s, int si, town *t, int ti) {
    int i, j;
    i = 0;
    while (i < s->offices[si].packages_count) {
        if (is_movable(t->offices[ti], s->offices[si].packages[i].weight)) {
            int *tp = &t->offices[ti].packages_count;
            t->offices[ti].packages = (package *) 
realloc(t->offices[ti].packages, (*tp+1) * sizeof(package));
            t->offices[ti].packages[(*tp)++] = s->offices[si].packages[i];
            int *sp = &s->offices[si].packages_count
            for (j = i; j < *sp-1; j++) {
                s->offices[si].packages[j] = s->offices[si].packages[j+1];
            }
            s->offices[si].packages = (package *) 
realloc(s->offices[si].packages, (*sp-1) * sizeof(package));
            (*sp)--;
        }
        else i++;
    }
}
town town_with_most_packages(town *towns, int towns_count) {
    int max = 0 , r = 0, i;
    for (i = 0; i < towns_count; i++) {
        int packages_count = 0;
        for (int j = 0; j < towns[i].offices_count; j++) {
            packages_count += towns[i].offices[j].packages_count;
        }
        if (packages_count > max) {
            max  = packages_count;
            r = i;
        }
    }
    return towns[r];
}
town *find_town(town *towns, int towns_count, char *name) {
    for (int i = 0; i < towns_count; i++) {
        if (!strcmp(name, towns[i].name))
            return &towns[i];
    }
    return NULL;
}
int main()
{
    int towns_count;
    scanf("%d", &towns_count);
    town* towns = malloc(sizeof(town)*towns_count);
    for (int i = 0; i < towns_count; i++) {
        towns[i].name = malloc(sizeof(char) * MAX_STRING_LENGTH);
        scanf("%s", towns[i].name);
        scanf("%d", &towns[i].offices_count);
        towns[i].offices = malloc(sizeof(post_office)*towns[i].offices_count);
        for (int j = 0; j < towns[i].offices_count; j++) {
scanf("%d%d%d", &towns[i].offices[j].packages_count, &towns[i].offices[j].min_weight, &towns[i].offices[j].max_weight);
towns[i].offices[j].packages = malloc(sizeof(package)*towns[i].offices[j].packages_count);
  for (int k = 0; k < towns[i].offices[j].packages_count; k++) {
   towns[i].offices[j].packages[k].id = malloc(sizeof(char* MAX_STRING_LENGTH);
                scanf("%s", towns[i].offices[j].packages[k].id);
                scanf("%d", &towns[i].offices[j].packages[k].weight);
            }
        }
    }
    int queries;
    scanf("%d", &queries);
    char town_name[MAX_STRING_LENGTH];
    while (queries--) {
        int type;
        scanf("%d", &type);
        switch (type) {
        case 1:
            scanf("%s", town_name);
            town* t = find_town(towns, towns_count, town_name);
            print_all_packages(*t);
            break;
        case 2:
            scanf("%s", town_name);
            town* source = find_town(towns, towns_count, town_name);
            int source_index;
            scanf("%d", &source_index);
            scanf("%s", town_name);
            town* target = find_town(towns, towns_count, town_name);
            int target_index;
            scanf("%d", &target_index);
         send_all_acceptable_packages(source, source_index, target,target_index);
break;
        case 3:
           printf("Town with the most number of packages is %s\n"town_with_most_packages(towns, towns_count).name);
            break;
        }
    }
    return 0;
}