Tarango

Black and White

Sep 16th, 2015
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 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. #define st 0
  11. #define ed 1000000000
  12.  
  13. struct vert{
  14.     int color;
  15.     int prop;
  16. };
  17. vert tree[Size*4];
  18.  
  19. void build_tree(int cur,int Start,int End){
  20.     if(Start == End){
  21.         tree[cur].color = 1;
  22.         tree[cur].prop = -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].color = 1;
  31.     tree[cur].prop = -1;
  32. }
  33.  
  34. void update_child(int cur,int left,int right){
  35.     tree[left].color = tree[cur].prop;
  36.     tree[right].color = tree[cur].prop;
  37.     tree[left].prop = tree[cur].prop;
  38.     tree[right].prop = tree[cur].prop;
  39.     tree[cur].prop = -1;
  40. }
  41.  
  42. void update_tree(int cur,int Start,int End,int u,int v,int value){
  43.     if(End < u || Start > v) return;
  44.     if(Start >= u && End <= v){
  45.         tree[cur].color  = value;
  46.         tree[cur].prop  = value;
  47.         return;
  48.     }
  49.     int left = cur*2;
  50.     int right = left+1;
  51.     int mid = (Start+End)/2;
  52.     if(tree[cur].prop != -1){
  53.         update_child(cur,left,right);
  54.     }
  55.  
  56.     update_tree(left,Start,mid,u,v,value);
  57.     update_tree(right,mid+1,End,u,v,value);
  58. }
  59.  
  60. int tree_query(int cur,int Start,int End,int u,int v){
  61.     if(End < u || Start > v){
  62.         return 0;
  63.     }
  64.     if(Start >= u && End <= v){
  65.         return tree[cur].color;
  66.     }
  67.     int left = cur*2;
  68.     int right = left+1;
  69.     int mid = (Start+End)/2;
  70.  
  71.     if(tree[cur].prop != -1){
  72.         update_child(cur,left,right);
  73.     }
  74.  
  75.     int s1 = tree_query(left,Start,mid,u,v);
  76.     int s2 = tree_query(right,mid+1,End,u,v);
  77.     return (s1+s2);
  78. }
  79.  
  80. int S[Size];
  81. int T[Size];
  82. char Q[Size][2];
  83. vector<int> Values;
  84. map<int,int> Map,name;
  85. int Range,qry,u,v,val,N,id;
  86.  
  87. void data_compress(){
  88.     sort(Values.begin(),Values.end());
  89.     Map.clear();
  90.     int SS = (int)Values.size();
  91.     id = 0;
  92.     for(int i = 0;i<SS;i++){
  93.         Map[Values[i]] = ++id;
  94.         name[id] = Values[i];
  95.     }
  96.     for(int i = 0;i<qry;i++){
  97.         S[i] = Map[S[i]];
  98.         T[i] = Map[T[i]];
  99.     }
  100.     N = id;
  101. }
  102.  
  103. int res_st,res_ed;
  104.  
  105. int solve(){
  106.     int i = -1,j = 0,Max = 0;
  107.     for(int cur = 0;cur<=id;cur++){
  108.         int color = tree_query(1,1,N,cur,cur);
  109.         if(color == 1){
  110.             if(i == -1){
  111.                 i = j = cur;
  112.             }else{
  113.                 j = cur;
  114.             }
  115.         }else{
  116.             if(i == -1) continue;
  117.             if(name[j]-name[i]+1 > Max){
  118.                 Max = name[j]-name[i]+1;
  119.                 res_st = name[i],res_ed = name[j];
  120.             }
  121.             i = j = -1;
  122.         }
  123.     }
  124.     if(i == -1) return Max;
  125.     if(name[j]-name[i]+1 > Max){
  126.         Max = name[j]-name[i]+1;
  127.         res_st = name[i],res_ed = name[j];
  128.     }
  129.     return Max;
  130. }
  131.  
  132. int main() {
  133.     scanf("%d",&qry);
  134.     Values.push_back(st);
  135.     Values.push_back(ed);
  136.     Map[0] = Map[ed] = 1;
  137.     for(int i = 0;i<qry;i++){
  138.         scanf("%d %d %s",&S[i],&T[i],Q[i]);
  139.         if(Map[S[i]] == 0) Values.push_back(S[i]);
  140.         Map[S[i]] = 1;
  141.         if(Map[T[i]] == 0) Values.push_back(T[i]);
  142.         Map[T[i]] = 1;
  143.         if(S[i] != st){
  144.             if(Map[S[i]-1] == 0) Values.push_back(S[i]-1);
  145.             Map[S[i]-1] = 1;
  146.         }
  147.         if(T[i] != ed){
  148.             if(Map[T[i]+1] == 0) Values.push_back(T[i]+1);
  149.             Map[T[i]+1] = 1;
  150.         }
  151.     }
  152.     data_compress();
  153.     build_tree(1,1,N);
  154.     for(int i = 0;i<qry;i++){
  155.         //printf("Range: %d - %d\n",S[i],T[i]);
  156.         if(Q[i][0] == 'w'){
  157.             update_tree(1,1,N,S[i],T[i],1);
  158.         }else{
  159.             update_tree(1,1,N,S[i],T[i],0);
  160.         }
  161.     }
  162.     int found = solve();
  163.     if(found != 0){
  164.         cout << res_st-1 << " " << res_ed << endl;
  165.     }
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment