Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include "genlib.h"
  2. #include "simpio.h"
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <map>
  7. #include <stdlib.h>
  8.  
  9. #define I 0;
  10. #define D 1;
  11. #define K 2;
  12. #define C 3;
  13.  
  14.  
  15. struct node {
  16.     int val;
  17.     int real; //1 real, 0 not dded, -1 sum
  18. };
  19.  
  20. char chrs[200000];
  21. int nums[200000];
  22. int arr[200000];
  23. node tree[400000];
  24.  
  25. int cmpInt(const void *a, const void *b) {
  26.     int a1 = *(int*)a;
  27.     int b1 = *(int*)b;
  28.     if(a1 > b1)
  29.         return 1;
  30.     if(a1 < b1)
  31.         return -1;
  32.     return 0;
  33. }
  34.  
  35. void updateSum(int init, int index, int start, int end, int realDif, int upDif) {
  36.     if(index < start || index > end || init == index || start == end) return;
  37.     tree[init].real += realDif;
  38.     tree[init].val += upDif;
  39.     updateSum(init*2, index, start, (start+end)/2, realDif, upDif);
  40.     updateSum(init*2+1, index, (start+end)/2 + 1, end, realDif, upDif);
  41.  
  42.  
  43. }
  44.  
  45. int bsrch(int key, int start, int end) {
  46.     if(start >end) return -1;
  47.     int mid = (end  + start)/2;
  48.     if(tree[mid].val == key) return mid;
  49.     if(tree[mid].val > key)
  50.      return bsrch(key, start, mid-1);
  51.     return bsrch(key, mid + 1, end);
  52. }
  53.  
  54. void IorD(int szLeafs, int toAdd, int ifDoAdd) {
  55.     const void* a = &toAdd;
  56.     int start = szLeafs;
  57.     int end = 2*szLeafs - 1;
  58.     int index = bsrch(toAdd, szLeafs, 2*szLeafs-1);
  59.     if(ifDoAdd == 1) {
  60.         if(tree[index].real == 1) return;
  61.         tree[index].real = 1;
  62.     } else {
  63.         if(tree[index].real == 0) return;
  64.         tree[index].real = 0;
  65.     }
  66.     int up = ifDoAdd*tree[index].val;
  67.     updateSum(1, index, start, end, ifDoAdd, up);
  68. }
  69.  
  70. //int answerOnC(node* root, int min, int wanted) {
  71. //  if(root->real == 0)
  72. //      return 0;
  73. //  if(root->real == 1) {
  74. //      if(root->val < wanted)
  75. //          return 1;
  76. //      return 0;
  77. //  }
  78. //  return answerOnC(root->left, min, wanted) +
  79. //      answerOnC(root->right, min, wanted);
  80. //}
  81.  
  82. void fullArr(int size, int curInd, int stInd, int endInd) {
  83.     if(stInd > endInd)
  84.         return;
  85.     if(stInd == endInd) {
  86.         node nd;
  87.         if(stInd > size)
  88.             nd.val = 100000009;
  89.         else {
  90.             nd.val = arr[curInd];
  91.         }
  92.         nd.real = 0;
  93.         tree[curInd] = nd;
  94.     } else {
  95.         fullArr(size, curInd*2, stInd, (stInd + endInd)/2);
  96.         fullArr(size, curInd*2 + 1, (stInd + endInd)/2 + 1, endInd);
  97.         tree[curInd].val = tree[curInd*2 + 1].val + tree[curInd*2].val;
  98.         tree[curInd].real = 0;
  99.         if(tree[curInd*2].real != 0)
  100.             tree[curInd].real += tree[curInd*2].real;
  101.         if(tree[curInd*2+1].real != 0)
  102.             tree[curInd].real += tree[curInd*2+1].real;
  103.     }
  104. }
  105.  
  106. void readInput(int N, int &size) {
  107.     char got;
  108.     int m;
  109.     map<int, char> mp;
  110.     map<int, char>::iterator it;
  111.     for(int i = 0; i < N; i++) {
  112.         scanf("%c %d\n", &got, &m);
  113.         chrs[i] = got;
  114.         nums[i] = m;
  115.         if(got == 'I') {
  116.             it = mp.find(m);
  117.             if(it == mp.end()) {
  118.                 arr[size] = m;
  119.                 size++;
  120.                 mp[m] = '-';
  121.             }
  122.         }
  123.     }
  124. }
  125.  
  126.  
  127. int main() {
  128.     int N;
  129.     scanf("%d\n", &N);
  130.     int size = 0;
  131.     readInput(N, size);
  132.     qsort(arr, size, sizeof(int), cmpInt);
  133.     int getPow = 1;
  134.     for(int i = 1; i < 20; i++) {
  135.         getPow *= 2;
  136.         if(getPow > size)
  137.             break;
  138.     }
  139.     char got;
  140.     fullArr(size, 1, 0, getPow -1);
  141.     for(int i = 0; i < 2*getPow; i++) {
  142.         printf("%d ", tree[i].val);
  143.     }
  144.     scanf("%d\n", &N);
  145.     /*for(int i = 0; i < N; i++) {
  146.         switch(got){
  147.         case('I'):
  148.  
  149.             break;
  150.         case('D'):
  151.  
  152.             break;
  153.         case('K'):
  154.  
  155.             break;
  156.         case('C'):
  157.            
  158.             //printf("%d\n", answerOnC);
  159.             break;
  160.         }
  161.     }*/
  162.    
  163.     /*int wholeSize = 2*firstFloor;
  164.     node ** arr = fullArr(wholeSize, firstFloor);*/
  165.  
  166.  
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement