Wednesday 26 July 2017

Lightoj 1087 Diablo (SQRT decomposition)


  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 200005
  4. int input[MAXN], SQRSIZE;
  5. int arr[MAXN];               // original array
  6. int block[500];          // decomposed array
  7. int blk_sz, n, q, indx;                      // block size
  8. // Time Complexity : O(1)
  9. void update(int idx, int val)
  10. {
  11.     int blockNumber = idx / blk_sz;
  12.     block[blockNumber]--;
  13.     arr[idx] = val;
  14. }
  15.  void show(){for(int i = 0; i <indx; i++) cout<<arr[i]<<" ";
  16.         cout<<"the array\n";
  17.  }
  18.  void add(int val)
  19. {
  20.     int blockNumber = indx / blk_sz;
  21.     block[blockNumber]++;
  22.     arr[indx] = val;
  23.     indx++;
  24.     //show();
  25. }
  26. int query(int ix)
  27. {
  28.     if(ix>=indx) return -1;
  29.     int sum = 0,l = 0, ans = -1;
  30.     while (sum+block[l] < ix)
  31.     {
  32.         sum+= block[l];
  33.         l++;
  34.     }
  35.     int c = l*blk_sz;
  36.     l = sum;
  37.    
  38.     while (c!=indx)
  39.     {
  40.         if(== ix&& arr[c]!=-1 ) {ans = arr[c];arr[c] = -1;update(c, -1);return ans;}
  41.         if(arr[c]!= -1) l++, c++;
  42.         else c++;
  43.     }
  44.     return -1;
  45. }
  46. void preprocess(int input[]int n)
  47. {
  48.     int blk_idx = -1;
  49.     indx = n;
  50.     for (int i=0; i<n; i++)
  51.     {
  52.         arr[i] = input[i];
  53.         if (i%blk_sz == 0)
  54.         {
  55.             blk_idx++;
  56.         }
  57.         block[blk_idx]++;
  58.     }
  59. }
  60. // Driver code
  61. int main()
  62. {  
  63.     int ts;
  64.     scanf("%d"&ts);
  65.     for(int p = 1; p <=ts; p++){
  66.     printf("Case %d:\n", p);
  67.     scanf("%d%d"&n, &q);
  68.     for(int i = 0; i <n; i++) scanf("%d"&input[i]);
  69.     SQRSIZE = n+q;
  70.     blk_sz = (int)sqrt(n+q) + 1;
  71.     //cout<<"block size"<<blk_sz<<" ";
  72.     memset(arr, -1sizeof(arr));
  73.     preprocess(input, n);
  74.     //for(int i = 0; i <n; i++)cout<<arr[i]<<" ";
  75.     for(int i = 0; i <q; i++){
  76.     char ch;
  77.     getchar();
  78.     scanf("%c"&ch);
  79.     if(ch == 'a') {
  80.         int id;
  81.         scanf("%d"&id);
  82.         add(id);
  83.     }
  84.     else {
  85.         int id;
  86.         scanf("%d"&id);
  87.         int ans = query(id-1);
  88.         if(ans  == -1) printf("none\n");
  89.         else printf("%d\n", ans);
  90.        
  91.     }
  92.     }
  93.     }
  94.    
  95.     return 0;
  96. }
  97. //may be a little bug but i can't get it 
  98. /*
  99. 1 5 8
  100. 6 5 3 2 1
  101. c 1
  102. c 1
  103. a 20
  104. c 4
  105. c 4
  106. c 3
  107. c 2
  108. c 1
  109. */

No comments:

Post a Comment

Most Featured Post

Lightoj 1159 - Batman

http://lightoj.com/volume_showproblem.php?problem=1159 problem analysis: First i thought of this as if s1, s2 and s3 are those three str...