Data structure

 We must simulate the passage of time to compute waiting time...

 We need to keep these important information of messages:

   int now = 0;            // Current time
   int lastEventTime = 0;  // Time of the last event

   int recvTime[101];      // recvTime[k] = time that the msg from friend k
                           //               was received

   int waitTime[101];      // waitTime[k] = total wait time for friend k


Initialization: for ( int i = 1; i <= 100; i++ ) { recvTime[i] = 0; waitTime[i] = 0; }

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0 R 2 ----------> lastEventTime = now (= 0) recvTime[2] = now (= 0) now = 1 <--- advance time !

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0 R 2 ----------> lastEventTime = now (= 0) recvTime[2] = now (= 0) now = 1 R 3 ----------> lastEventTime = now (= 1) recvTime[3] = now (= 1) now = 2

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0 R 2 ----------> lastEventTime = now (= 0) recvTime[2] = now (= 0) now = 1 R 3 ----------> lastEventTime = now (= 1) recvTime[3] = now (= 1) now = 2 W 5 1 + 5 = 6 now = 6

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0 R 2 ----------> lastEventTime = now (= 0) recvTime[2] = now (= 0) now = 1 R 3 ----------> lastEventTime = now (= 1) recvTime[3] = now (= 1) now = 2 W 5 1 + 5 = 6 now = 6 S 2 ----------> lastEventTime = now (= 6) delay = now - 0 = 6

How to simlate passing of time

Sample input:

       5
       R 2
       R 3
       W 5
       S 2
       S 3


now = 0 R 2 ----------> lastEventTime = now (= 0) recvTime[2] = now (= 0) now = 1 R 3 ----------> lastEventTime = now (= 1) recvTime[3] = now (= 1) now = 2 W 5 1 + 5 = 6 now = 6 S 2 ----------> lastEventTime = now (= 6) delay = now - 0 = 6 now = 7 S 3 ----------> lastEventTime = now (= 7) delay = now - 1 = 6

J4 solution in C++

   cin >> M;
   int now = 0, lastEventTime = 0;

   for ( int i = 0; i < M; i++ )
   {
       cin >> action;
       cin >> frID;

       if ( action == 'R' )
       {
          lastEventTime = now;     // Record lastEventTime
          recvTime[frID] = now;    // Record msg recv time
          now++;                   // Advance clock
       }
       else if ( action == 'S' )
       {
          lastEventTime = now;     // Record lastEventTime

	  // Compute cumulative delay
          int delay = now - recvTime[frID];
          waitTime[frID] += delay;
          recvTime[frID] = 0;             // Reset (no lingering msg)

          now++;                   // Advance clock
       }
       else
       {  // W  frID
          now = lastEventTime + frID; // Advance time
       }
   }

   for ( int i = 0; i <= 100; i++ )
      if ( recvTime[i] > 0 )
         cout << i << " " << -1 << endl;  // Lingering msg
      else if ( waitTime[i] > 0 )
         cout << i << " " << waitTime[i] << endl;