Advertisement
phanindhar1

Tsort

Feb 6th, 2014
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.17 KB | None | 0 0
  1. #define MAX 1000001
  2.    
  3. #include <iostream>
  4. #include <fcntl.h>
  5. //Author Phanindhar Bodla
  6. class FastInput
  7. {  
  8.     public:
  9.     char buffer[32768];                                                         // max number of byte that can be read is max size of int
  10.     unsigned int data[16384];
  11.     unsigned int dataOffset, dataSize;                                          // dataSize for numbers read to buffer
  12.                                                                                 // dataOffset for numbers read from buffer
  13.     unsigned int v;                                                             // value
  14.     public:
  15.     FastInput()
  16.     {
  17.             dataOffset = 0;
  18.             dataSize = 0;
  19.             v = 0x80000000;
  20.     }
  21.     unsigned int ReadNext()
  22.     {
  23.              if (dataOffset == dataSize)
  24.              {
  25.                  int r = read(0, buffer, sizeof(buffer));                       // r==0 eof  r==-1 on error
  26.                  if (r <= 0) return v;                                          // if no read then buffer already has last valid value
  27.                  
  28.                  dataOffset = 0;
  29.                  dataSize = 0;
  30.                  
  31.                  int i = 0;
  32.                  if (buffer[0] < '0')                                           /* assumming input will contain only space and digits < '0' will work fine */
  33.                  {
  34.                     if ( v!= 0x80000000)                
  35.                     {
  36.                         data[dataSize++] = v;
  37.                         v = 0x80000000;                                         // setting back to -1
  38.                     }
  39.                     for (; (i < r) && (buffer[i] < '0'); ++i);
  40.                  }
  41.                  
  42.                  for (; i < r;)
  43.                  {
  44.                      if (buffer[i] >= '0')                                      // form a number till a non integer comes
  45.                      {
  46.                         v = v * 10 + buffer[i] - 48;
  47.                         ++i;
  48.                      }
  49.                      else                                                       // store formed number
  50.                      {
  51.                         data[dataSize++] = v;
  52.                         v = 0x80000000;
  53.                         for (i = i + 1; (i < r) && (buffer[i] < '0'); ++i);
  54.                      }
  55.                  }
  56.              }
  57.              return data[dataOffset++];
  58.         }
  59.     };
  60.    
  61. class FastOutput
  62. {    
  63.     public:
  64.    
  65.     char data[32768];
  66.     unsigned int dataOffset;
  67.     public:
  68.     FastOutput()
  69.     {                       dataOffset = 0;  
  70.                            
  71.     }
  72.     ~FastOutput() {}
  73.    
  74.     void Flush()
  75.     {
  76.          if (dataOffset)
  77.          {     if(write(1, data, dataOffset));
  78.                               dataOffset = 0;
  79.          }
  80.     }
  81.     void PrintUint(unsigned int v, char d)
  82.     {
  83.     if (dataOffset + 11 > sizeof(data)) Flush();
  84.    
  85.     // we would again need to change back numbers to chars to buffer out
  86.     if (v < 100000)
  87.     {
  88.        if (v < 1000)
  89.        {
  90.         if (v < 10)
  91.         {
  92.            data[dataOffset + 0] = v + 48;
  93.            dataOffset += 1;
  94.         } else if (v < 100)
  95.                {
  96.                     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  97.                     data[dataOffset + 0] = v + 48;
  98.                     dataOffset += 2;
  99.                }
  100.                else
  101.                {
  102.                     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  103.                     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  104.                     data[dataOffset + 0] = v + 48;
  105.                     dataOffset += 3;
  106.                }
  107.     } else {
  108.     if (v < 10000) {
  109.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  110.      
  111.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  112.      
  113.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  114.      
  115.     data[dataOffset + 0] = v + 48;
  116.      
  117.     dataOffset += 4;
  118.      
  119.     } else {
  120.      
  121.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  122.      
  123.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  124.      
  125.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  126.      
  127.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  128.      
  129.     data[dataOffset + 0] = v + 48;
  130.      
  131.     dataOffset += 5;
  132.      
  133.     }
  134.      
  135.     }
  136.      
  137.     } else {
  138.      
  139.     if (v < 100000000) {
  140.      
  141.     if (v < 1000000) {
  142.      
  143.     data[dataOffset + 5] = v - v / 10 * 10 + 48; v /= 10;
  144.      
  145.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  146.      
  147.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  148.      
  149.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  150.      
  151.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  152.      
  153.     data[dataOffset + 0] = v + 48;
  154.      
  155.     dataOffset += 6;
  156.      
  157.     } else if (v < 10000000) {
  158.      
  159.     data[dataOffset + 6] = v - v / 10 * 10 + 48; v /= 10;
  160.      
  161.     data[dataOffset + 5] = v - v / 10 * 10 + 48; v /= 10;
  162.      
  163.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  164.      
  165.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  166.      
  167.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  168.      
  169.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  170.      
  171.     data[dataOffset + 0] = v + 48;
  172.      
  173.     dataOffset += 7;
  174.      
  175.     } else {
  176.      
  177.     data[dataOffset + 7] = v - v / 10 * 10 + 48; v /= 10;
  178.      
  179.     data[dataOffset + 6] = v - v / 10 * 10 + 48; v /= 10;
  180.      
  181.     data[dataOffset + 5] = v - v / 10 * 10 + 48; v /= 10;
  182.      
  183.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  184.      
  185.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  186.      
  187.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  188.      
  189.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  190.      
  191.     data[dataOffset + 0] = v + 48;
  192.      
  193.     dataOffset += 8;
  194.      
  195.     }
  196.      
  197.     } else {
  198.      
  199.     if (v < 1000000000) {
  200.      
  201.     data[dataOffset + 8] = v - v / 10 * 10 + 48; v /= 10;
  202.      
  203.     data[dataOffset + 7] = v - v / 10 * 10 + 48; v /= 10;
  204.      
  205.     data[dataOffset + 6] = v - v / 10 * 10 + 48; v /= 10;
  206.      
  207.     data[dataOffset + 5] = v - v / 10 * 10 + 48; v /= 10;
  208.      
  209.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  210.      
  211.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  212.      
  213.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  214.      
  215.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  216.      
  217.     data[dataOffset + 0] = v + 48;
  218.      
  219.     dataOffset += 9;
  220.      
  221.     } else {
  222.      
  223.     data[dataOffset + 9] = v - v / 10 * 10 + 48; v /= 10;
  224.      
  225.     data[dataOffset + 8] = v - v / 10 * 10 + 48; v /= 10;
  226.      
  227.     data[dataOffset + 7] = v - v / 10 * 10 + 48; v /= 10;
  228.      
  229.     data[dataOffset + 6] = v - v / 10 * 10 + 48; v /= 10;
  230.      
  231.     data[dataOffset + 5] = v - v / 10 * 10 + 48; v /= 10;
  232.      
  233.     data[dataOffset + 4] = v - v / 10 * 10 + 48; v /= 10;
  234.      
  235.     data[dataOffset + 3] = v - v / 10 * 10 + 48; v /= 10;
  236.      
  237.     data[dataOffset + 2] = v - v / 10 * 10 + 48; v /= 10;
  238.      
  239.     data[dataOffset + 1] = v - v / 10 * 10 + 48; v /= 10;
  240.      
  241.     data[dataOffset + 0] = v + 48;
  242.      
  243.     dataOffset += 10;
  244.      
  245.     }
  246.      
  247.     }
  248.      
  249.     }
  250.      
  251.     data[dataOffset++] = d;
  252.      
  253.     }
  254.      
  255.    
  256.     void PrintChar(char d)
  257.     {
  258.      
  259.      if (dataOffset + 1 > sizeof(data)) Flush();
  260.      data[dataOffset++] = d;
  261.      
  262.     }
  263.  
  264.     void ReplaceChar(int offset, char d)
  265.     {
  266.          data[dataOffset + offset] = d;
  267.     }
  268.    
  269. };
  270.  
  271. FastInput global_File_Input;
  272. FastOutput global_File_Output;
  273. int main()
  274. {
  275.     unsigned int lengthOfArray = global_File_Input.ReadNext(),tempValue,maxValue=0;
  276.     unsigned int *inputArray= new unsigned int[MAX*sizeof(unsigned int)];
  277.     while(lengthOfArray--)
  278.     {
  279.     tempValue = global_File_Input.ReadNext();
  280.     inputArray[tempValue]++;
  281.     if(tempValue>maxValue)maxValue=tempValue;
  282.     }
  283.     for(unsigned int index=0;index<=maxValue;index++)
  284.     while(inputArray[index]--)
  285.     global_File_Output.PrintUint(index, '\n');
  286.     global_File_Output.Flush();
  287.     global_File_Input.ReadNext();
  288.     return 0;
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement