Tarango

Points In Segments

Aug 24th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. //============================================================================
  2. // Name        : ACM
  3. // Author      : Tarango Khan
  4. // Team        : BRACU Byteheads
  5. //============================================================================
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9. #define Size 150005
  10.  
  11. struct vert{
  12.     int sum;
  13.     int prop;
  14.     int child;
  15. };
  16. vert tree[Size*4];
  17.  
  18. void build_tree(int cur,int Start,int End){
  19.     if(Start == End){
  20.         tree[cur].sum = 0;
  21.         tree[cur].prop = 0;
  22.         tree[cur].child = 1;
  23.         return;
  24.     }
  25.     int left = cur*2;
  26.     int right = left+1;
  27.     int mid = (Start+End)/2;
  28.     build_tree(left,Start,mid);
  29.     build_tree(right,mid+1,End);
  30.     tree[cur].sum = 0;
  31.     tree[cur].prop = 0;
  32.     tree[cur].child = tree[left].child + tree[right].child;
  33. }
  34.  
  35. void update_child(int cur,int left,int right){
  36.     tree[left].sum += tree[left].child*tree[cur].prop;
  37.     tree[left].prop += tree[cur].prop;
  38.     tree[right].sum += tree[right].child*tree[cur].prop;
  39.     tree[right].prop += tree[cur].prop;
  40.     tree[cur].prop = 0;
  41. }
  42.  
  43. void update_tree(int cur,int Start,int End,int u,int v,int value){
  44.     if(End < u || Start > v) return;
  45.     if(Start >= u && End <= v){
  46.         tree[cur].sum += tree[cur].child*value;
  47.         tree[cur].prop += value;
  48.         return;
  49.     }
  50.     int left = cur*2;
  51.     int right = left+1;
  52.     int mid = (Start+End)/2;
  53.  
  54.     if(tree[cur].prop != 0){
  55.         update_child(cur,left,right);
  56.     }
  57.  
  58.     update_tree(left,Start,mid,u,v,value);
  59.     update_tree(right,mid+1,End,u,v,value);
  60. }
  61.  
  62. int tree_query(int cur,int Start,int End,int u,int v){
  63.     if(End < u || Start > v){
  64.         return 0;
  65.     }
  66.     if(Start >= u && End <= v){
  67.         return tree[cur].sum;
  68.     }
  69.     int left = cur*2;
  70.     int right = left+1;
  71.     int mid = (Start+End)/2;
  72.  
  73.     if(tree[cur].prop != 0){
  74.         update_child(cur,left,right);
  75.     }
  76.  
  77.     int s1 = tree_query(left,Start,mid,u,v);
  78.     int s2 = tree_query(right,mid+1,End,u,v);
  79.     return (s1+s2);
  80. }
  81.  
  82. int S[Size];
  83. int T[Size];
  84. int Q[Size];
  85. vector<int> Values;
  86. map<int,int> Map;
  87. int Range,qry,u,v,val,N;
  88.  
  89. void data_compress(){
  90.     sort(Values.begin(),Values.end());
  91.     Map.clear();
  92.     int SS = (int)Values.size(),id = 0;
  93.     for(int i = 0;i<SS;i++){
  94.         Map[Values[i]] = ++id;
  95.     }
  96.     for(int i = 0;i<Range;i++){
  97.         S[i] = Map[S[i]];
  98.         T[i] = Map[T[i]];
  99.     }
  100.     for(int i = 0;i<qry;i++){
  101.         Q[i] = Map[Q[i]];
  102.     }
  103.     N = id;
  104.     /*
  105.     for(int i = 0;i<SS;i++){
  106.         printf("Map %d = %d\n",Values[i],Map[Values[i]]);
  107.     }
  108.     */
  109. }
  110.  
  111. int main() {
  112.     int nCase;
  113.     scanf("%d",&nCase);
  114.     for(int cs = 1;cs<= nCase;cs++){
  115.         scanf("%d %d",&Range,&qry);
  116.         Map.clear();
  117.         Values.clear();
  118.         for(int i = 0;i<Range;i++){
  119.             scanf("%d %d",&S[i],&T[i]);
  120.             if(Map[S[i]] == 0) Values.push_back(S[i]);
  121.             Map[S[i]] = 1;
  122.             if(Map[T[i]] == 0) Values.push_back(T[i]);
  123.             Map[T[i]] = 1;
  124.         }
  125.         for(int i = 0;i<qry;i++){
  126.             scanf("%d",&Q[i]);
  127.             if(Map[Q[i]] == 0) Values.push_back(Q[i]);
  128.             Map[Q[i]] = 1;
  129.         }
  130.         data_compress();
  131.         build_tree(1,1,N);
  132.         printf("Case %d:\n",cs);
  133.         for(int i = 0;i<Range;i++){
  134.             //printf("Range: %d - %d\n",S[i],T[i]);
  135.             update_tree(1,1,N,S[i],T[i],1);
  136.         }
  137.         for(int i = 0;i<qry;i++){
  138.             //printf("Range: %d\n",Q[i]);
  139.             int sum = tree_query(1,1,N,Q[i],Q[i]);
  140.             printf("%d\n",sum);
  141.         }
  142.     }
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment