Advertisement
Nickpips

Untitled

Aug 20th, 2016
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.73 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Scanner;
  4.  
  5. public class D {
  6.     public static void main(String[] args) {
  7.         Scanner in = new Scanner(System.in);
  8.  
  9.         int n = in.nextInt();
  10.         int m = in.nextInt();
  11.         int q = in.nextInt();
  12.  
  13.         ArrayList<Integer>[][] swaps = new ArrayList[n][m];
  14.  
  15.         for (int i = 0; i < n; i++) {
  16.             for (int j = 0; j < m; j++) {
  17.                 swaps[i][j] = new ArrayList<Integer>();
  18.             }
  19.         }
  20.  
  21.         ArrayList<Integer>[] rowSwaps = new ArrayList[n];
  22.        
  23.         int u = (int)Math.sqrt(n);
  24.         int v = (int)Math.sqrt(m);
  25.        
  26.         int[] rowBins = new int[(n-1)/u + 1];
  27.         int[][] colBins = new int[rowBins.length][(m-1)/v + 1];
  28.  
  29.         for( int i = 0; i < rowBins.length; i++ )
  30.         {
  31.             rowBins[i] = -1;
  32.         }
  33.         for( int i = 0; i < colBins.length; i++ )
  34.         {
  35.             for( int j = 0; j < colBins[i].length; j++ )
  36.             {
  37.                 colBins[i][j] = -1;
  38.             }
  39.         }
  40.        
  41.         for (int i = 0; i < n; i++) {
  42.             rowSwaps[i] = new ArrayList<Integer>();
  43.         }
  44.        
  45.         int books = 0;
  46.        
  47.         ArrayList<Integer> answers = new ArrayList<Integer>();
  48.         answers.add(0);
  49.  
  50.         for (int t = 1; t <= q; t++) {
  51.             int type = in.nextInt();
  52.  
  53.             int i = 0, j = 0, k = 0;
  54.  
  55.             if( type <= 2 )
  56.             {
  57.                 i = in.nextInt() - 1;
  58.                 j = in.nextInt() - 1;
  59.                
  60.                 int rBin = i / u;
  61.                 if( rowBins[rBin] != -1 )
  62.                 {
  63.                     for( int c = (i/u) * u; c / u == rBin; c++ )
  64.                     {
  65.                         int sm = leq(rowSwaps[c], rowBins[rBin] );
  66.                         if( (sm % 2) != (rowSwaps[c].size() % 2) )
  67.                         {
  68.                             rowSwaps[c].add(sm, rowBins[rBin]);
  69.                         }
  70.                     }
  71.                 }
  72.                 rowBins[rBin] = -1;
  73.                
  74.  
  75.                 int cBin = j / v;
  76.                 if( colBins[rBin][cBin] != -1 )
  77.                 {
  78.                     for( int c = (j / v) * v; c / v == cBin; c++ )
  79.                     {
  80.                         int sm = leq( swaps[i][c], colBins[rBin][cBin] );
  81.                         if( (sm % 2) != (swaps[i][c].size() % 2) )
  82.                         {
  83.                             swaps[i][c].add(sm, colBins[rBin][cBin]);
  84.                         }
  85.                     }
  86.                 }
  87.                 colBins[rBin][cBin] = -1;
  88.             }
  89.            
  90.             if( type == 1 )
  91.             {
  92.                 // place i,j
  93.                 if ((swaps[i][j].size() + rowSwaps[i].size()) % 2 == 0) {
  94.                     swaps[i][j].add(t);
  95.                     books++;
  96.                 }
  97.             } else if( type == 2 )
  98.             {
  99.                 // remove i,j
  100.                 if ((swaps[i][j].size() + rowSwaps[i].size()) % 2 != 0) {
  101.                     swaps[i][j].add(t);
  102.                     books--;
  103.                 }
  104.             } else if( type == 3 ) {
  105.                 // invert row i
  106.                 i = in.nextInt() - 1;
  107.                 // 0 1 2 3 4 5 6 7 8 9
  108.                 // 0 0 0 1 1 1 2 2 2 3
  109.                 // u = 3
  110.                
  111.                 int bin = i / u;
  112.                 if( rowBins[bin] != -1 )
  113.                 {
  114.                     for( int c = (i/u) * u; c / u == bin; c++ )
  115.                     {
  116.                         int sm = leq(rowSwaps[c], rowBins[bin] );
  117.                         if( (sm % 2) != (rowSwaps[c].size() % 2) )
  118.                         {
  119.                             rowSwaps[c].add(sm, rowBins[bin]);
  120.                         }
  121.                     }
  122.                 }
  123.                 rowBins[bin] = -1;
  124.                
  125.                
  126.                 for( int c = 0; c < m; c++ )
  127.                 {
  128.                     if( (swaps[i][c].size() + rowSwaps[i].size()) % 2 == 0 )
  129.                     {
  130.                         books++;
  131.                     } else
  132.                     {
  133.                         books--;
  134.                     }
  135.                 }
  136.                
  137.                 rowSwaps[i].add(t);
  138.             } else {
  139.                 // go back to state k
  140.                 k = in.nextInt();
  141.                
  142.                 for( int c = 0; c < rowBins.length; c++ )
  143.                 {
  144.                     rowBins[c] = k;
  145.                 }
  146.                 for( int c = 0; c < colBins.length; c++ )
  147.                 {
  148.                     for( int d = 0; d < colBins[c].length; d++ )
  149.                     {
  150.                         colBins[c][d] = k;
  151.                     }
  152.                 }
  153.                 books = answers.get(k);
  154.             }
  155.            
  156.             answers.add(books);
  157.            
  158.             System.out.println(books);
  159.         }
  160.     }
  161.  
  162.     static int leq(ArrayList<Integer> arr, int val) {
  163.         if( arr.size() == 0 )
  164.             return 0;
  165.        
  166.         // [1, 2, 4], 0, 2
  167.         // 1, 2
  168.         // 1
  169.         int l = 0;
  170.         int r = arr.size() - 1;
  171.  
  172.         while (l != r) {
  173.             int mid = (l + r) / 2;
  174.             if (arr.get(mid) > val) {
  175.                 r = mid;
  176.             } else if (arr.get(mid) < val) {
  177.                 l = mid;
  178.             } else {
  179.                 return mid;
  180.             }
  181.         }
  182.  
  183.         if (arr.get(l) > val) {
  184.             return l;
  185.         } else {
  186.             return l + 1;
  187.         }
  188.     }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement