http://acm.pku.edu.cn/JudgeOnline/problem?id=1209

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  int month, date, imp;
  char event[512];
  int id;
} aniv_t;

aniv_t a[1024];
int na = 0;
int year, date, month;
int first = 1;

void reg(int _date, int _month, int imp, char *event)
{
  char *p;
  p = event; while (*p == ' ') { p++; }
  
  a[na].month = _month;
  a[na].date  = _date;
  a[na].imp   = imp;
  strcpy(a[na].event, p);
  a[na].id    = na;
  na++;
}

int diff(int date1, int month1, int date2, int month2)
{
  int d = 0;
  int y = year;
  int mdates[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  if (month1 == month2 && date1 > date2) {
    d += mdates[month1-1] + (y % 4 == 0 && month1 == 2 ? 1 : 0);
    month1++;
    if (month1 > 12) { month1 = 1; y++; }
  }
  while (month1 != month2) {
    d += mdates[month1-1] + (y % 4 == 0 && month1 == 2 ? 1 : 0);
    month1++;
    if (month1 > 12) { month1 = 1; y++; }
  }
  d += date2 - date1;

  return d;
}

int cmp(const void *_a, const void *_b)
{
  int ya = year, yb = year;
  int da, db;
  aniv_t *a = (aniv_t *)_a, *b = (aniv_t *)_b;
  da = diff(date, month, a->date, a->month);
  db = diff(date, month, b->date, b->month);

  if (a->month < month || (a->month == month && a->date < date)) { ya++; }
  if (b->month < month || (b->month == month && b->date < date)) { yb++; }

  if (a->date == date && a->month == month &&
      b->date == date && b->month == month) {
    if (a->id < b->id) { return -1; }
    if (a->id > b->id) { return 1; }
  }
  if (a->date == date && a->month == month) { return -1; }
  if (b->date == date && b->month == month) { return 1; }
  if (a->imp - (da - 1) > b->imp - (db - 1)) { return -1; }
  if (a->imp - (da - 1) < b->imp - (db - 1)) { return 1; }
  if (ya < yb) { return -1; }
  if (ya > yb) { return 1; }
  if (a->month < b->month) { return -1; }
  if (a->month > b->month) { return 1; }
  if (a->date < b->date) { return -1; }
  if (a->date > b->date) { return 1; }
  if (a->id < b->id) { return -1; }
  if (a->id > b->id) { return 1; }

  return 0;
}

int main()
{
  int imp;
  char temp[256];
  char *p;
  int i, j;
  int d;

  year = atoi(gets(temp));
  while (1) {
    gets(temp);
    if (strcmp(temp, "#") == 0) break;

    p = strtok(temp, " ");
    if (*p == 'A') {
      date  = atoi(strtok(NULL, " "));
      month = atoi(strtok(NULL, " "));
      imp   = atoi(strtok(NULL, " "));
      p     = strtok(NULL, "");
      reg(date, month, imp, p);
    }
    else if (*p == 'D') {
      if (first) {
	first = 0;
      }
      else {
	printf("\n");
      }

      date  = atoi(strtok(NULL, " "));
      month = atoi(strtok(NULL, " "));

      qsort(a, na, sizeof(aniv_t), cmp);

      printf("Today is: %2d %2d\n", date, month);
      for (i = 0; i < na; i++) {
	d = diff(date, month, a[i].date, a[i].month);
	if (a[i].imp - (d - 1) > 0) {
	  printf("%3d%3d ", a[i].date, a[i].month);
	  if (d == 0) {
	    printf("*TODAY* ");
	  }
	  else {
	    for (j = 0; j < a[i].imp - (d - 1); j++) { printf("*"); }
	    for (; j < 7; j++) { printf(" "); }
	    printf(" ");
	  }
	  printf("%s\n", a[i].event);
	}
      }
    }
    else {
    }
  }
}