- #include <stdio.h> 
-   
- 	struct Record 
- 	{ 
- 		int start; 
- 		int end; 
- 		int freq; 
- 	}; 
- 	void display(const struct Record *records, const struct Record *x_axis, const struct Record *y_axis, int length, int width); 
- 	int count_digits(int n); 
-   
- 	int main(int argc, char *argv[]) 
- 	{ 
- 		struct Record x_axis, y_axis; 
- 		int length, interval; 
- 		scanf("%u %u %u %u\n", &- x_axis. start, &- x_axis. end, &- y_axis. start, &- y_axis. end);
 
- 		scanf("%u\n", &- interval );
 
- 		int size = length / interval; 
- 		struct Record records[size]; 
- 		int k = 0; 
- 		int biggest_start = 0, biggest_end = 0; 
- 		for(int i = 0; i < length; ) 
- 		{ 
- 			int a, b; 
- 			struct Record current = {.start = 0, .end = 0, .freq = 0}; 
- 			for(int j = 0; j < interval; j++, i++) 
- 			{ 
- 				scanf("%u %u\n", &- a , &- b );
 
- 				if(current.start == 0) 
- 					current.start = a; 
- 				current.freq += b; 
- 			} 
- 			current.end = a; 
- 			//keeping track of the largest boundaries in order to estimate the width of the bars 
- 			//eg : 132 and 1934 will give a width of 3 (132) + 4 (1934) + 1 (space inbetween the numbers) = 8 
- 			if(current.start > biggest_start) 
- 				biggest_start = current.start; 
- 			if(current.end > biggest_end) 
- 				biggest_end = current.end; 
- 			current.freq /= interval; 
- 			records[k++] = current; 
- 		} 
- 		display(records, &x_axis, &y_axis, size, count_digits(biggest_start) + count_digits(biggest_end) + 1); 
-   
- 		return 0; 
- 	} 
-   
- 	void display(const struct Record *records, const struct Record *x_axis, const struct Record *y_axis, int length, int width) 
- 	{ 
- 		int left_pad = count_digits(y_axis->end); 
- 		for(int freq = y_axis->end; freq >= 1; freq--) 
- 		{ 
- 			printf("%*d ",-  left_pad ,-  freq );
 
- 			for(int i = 0; i < length; i++) 
- 			{ 
- 				//http://stackoverflow.com/a/16299867/3729391 
- 				if(records[i].freq >= freq) 
- 					printf("%.*s ",-  width , "##########################");
 
- 				else 
- 			} 
- 		} 
- 		printf("%*c ",-  left_pad , ' ');
 
- 		for(int i = 0; i < length; i++) 
- 			printf("%d%*d ",-  records [- i ]- . start,-  width  --  count_digits (- records [- i ]- . start),-  records [- i ]- . end);
 
- 	} 
-   
- 	int count_digits(int n) 
- 	{ 
- 		if(n == 0) 
- 			return 1; 
- 		for(int i = 1, count = 0; ; i *= 10, count++) 
- 			if(n / i == 0) 
- 				return count; 
- 	} 
				I2luY2x1ZGUgPHN0ZGlvLmg+CgoJc3RydWN0IFJlY29yZAoJewoJCWludCBzdGFydDsKCQlpbnQgZW5kOwoJCWludCBmcmVxOwoJfTsKCXZvaWQgZGlzcGxheShjb25zdCBzdHJ1Y3QgUmVjb3JkICpyZWNvcmRzLCBjb25zdCBzdHJ1Y3QgUmVjb3JkICp4X2F4aXMsIGNvbnN0IHN0cnVjdCBSZWNvcmQgKnlfYXhpcywgaW50IGxlbmd0aCwgaW50IHdpZHRoKTsKCWludCBjb3VudF9kaWdpdHMoaW50IG4pOwoKCWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCgl7CgkJc3RydWN0IFJlY29yZCB4X2F4aXMsIHlfYXhpczsKCQlpbnQgbGVuZ3RoLCBpbnRlcnZhbDsKCQlzY2FuZigiJXUgJXUgJXUgJXVcbiIsICZ4X2F4aXMuc3RhcnQsICZ4X2F4aXMuZW5kLCAmeV9heGlzLnN0YXJ0LCAmeV9heGlzLmVuZCk7CgkJc2NhbmYoIiV1XG4iLCAmaW50ZXJ2YWwpOwoJCXNjYW5mKCIldVxuIiwgJmxlbmd0aCk7CgkJaW50IHNpemUgPSBsZW5ndGggLyBpbnRlcnZhbDsKCQlzdHJ1Y3QgUmVjb3JkIHJlY29yZHNbc2l6ZV07CgkJaW50IGsgPSAwOwoJCWludCBiaWdnZXN0X3N0YXJ0ID0gMCwgYmlnZ2VzdF9lbmQgPSAwOwoJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICkKCQl7CgkJCWludCBhLCBiOwoJCQlzdHJ1Y3QgUmVjb3JkIGN1cnJlbnQgPSB7LnN0YXJ0ID0gMCwgLmVuZCA9IDAsIC5mcmVxID0gMH07CgkJCWZvcihpbnQgaiA9IDA7IGogPCBpbnRlcnZhbDsgaisrLCBpKyspCgkJCXsKCQkJCXNjYW5mKCIldSAldVxuIiwgJmEsICZiKTsKCQkJCWlmKGN1cnJlbnQuc3RhcnQgPT0gMCkKCQkJCQljdXJyZW50LnN0YXJ0ID0gYTsKCQkJCWN1cnJlbnQuZnJlcSArPSBiOwoJCQl9CgkJCWN1cnJlbnQuZW5kID0gYTsKCQkJLy9rZWVwaW5nIHRyYWNrIG9mIHRoZSBsYXJnZXN0IGJvdW5kYXJpZXMgaW4gb3JkZXIgdG8gZXN0aW1hdGUgdGhlIHdpZHRoIG9mIHRoZSBiYXJzCgkJCS8vZWcgOiAxMzIgYW5kIDE5MzQgd2lsbCBnaXZlIGEgd2lkdGggb2YgMyAoMTMyKSArIDQgKDE5MzQpICsgMSAoc3BhY2UgaW5iZXR3ZWVuIHRoZSBudW1iZXJzKSA9IDgKCQkJaWYoY3VycmVudC5zdGFydCA+IGJpZ2dlc3Rfc3RhcnQpCgkJCQliaWdnZXN0X3N0YXJ0ID0gY3VycmVudC5zdGFydDsKCQkJaWYoY3VycmVudC5lbmQgPiBiaWdnZXN0X2VuZCkKCQkJCWJpZ2dlc3RfZW5kID0gY3VycmVudC5lbmQ7CgkJCWN1cnJlbnQuZnJlcSAvPSBpbnRlcnZhbDsKCQkJcmVjb3Jkc1trKytdID0gY3VycmVudDsKCQl9CgkJZGlzcGxheShyZWNvcmRzLCAmeF9heGlzLCAmeV9heGlzLCBzaXplLCBjb3VudF9kaWdpdHMoYmlnZ2VzdF9zdGFydCkgKyBjb3VudF9kaWdpdHMoYmlnZ2VzdF9lbmQpICsgMSk7CgoJCXJldHVybiAwOwoJfQoKCXZvaWQgZGlzcGxheShjb25zdCBzdHJ1Y3QgUmVjb3JkICpyZWNvcmRzLCBjb25zdCBzdHJ1Y3QgUmVjb3JkICp4X2F4aXMsIGNvbnN0IHN0cnVjdCBSZWNvcmQgKnlfYXhpcywgaW50IGxlbmd0aCwgaW50IHdpZHRoKQoJewoJCWludCBsZWZ0X3BhZCA9IGNvdW50X2RpZ2l0cyh5X2F4aXMtPmVuZCk7CgkJZm9yKGludCBmcmVxID0geV9heGlzLT5lbmQ7IGZyZXEgPj0gMTsgZnJlcS0tKQoJCXsKCQkJcHJpbnRmKCIlKmQgIiwgbGVmdF9wYWQsIGZyZXEpOwoJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCgkJCXsKCQkJCS8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTYyOTk4NjcvMzcyOTM5MQoJCQkJaWYocmVjb3Jkc1tpXS5mcmVxID49IGZyZXEpCgkJCQkJcHJpbnRmKCIlLipzICIsIHdpZHRoLCAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKCQkJCWVsc2UKCQkJCQlwcmludGYoIiUuKnMgIiwgd2lkdGgsICIgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQl9CgkJCXByaW50ZigiXG4iKTsKCQl9CgkJcHJpbnRmKCIlKmMgIiwgbGVmdF9wYWQsICcgJyk7CgkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQoJCQlwcmludGYoIiVkJSpkICIsIHJlY29yZHNbaV0uc3RhcnQsIHdpZHRoIC0gY291bnRfZGlnaXRzKHJlY29yZHNbaV0uc3RhcnQpLCByZWNvcmRzW2ldLmVuZCk7Cgl9CgoJaW50IGNvdW50X2RpZ2l0cyhpbnQgbikKCXsKCQlpZihuID09IDApCgkJCXJldHVybiAxOwoJCWZvcihpbnQgaSA9IDEsIGNvdW50ID0gMDsgOyBpICo9IDEwLCBjb3VudCsrKQoJCQlpZihuIC8gaSA9PSAwKQoJCQkJcmV0dXJuIGNvdW50OwoJfQ==