Advertisement
ismaeil

D. Intersecting Segments

Jul 17th, 2020
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 5e1;
  5. typedef vector<int> vi;
  6. #define rg (p << 1) | 1
  7. #define lf (p << 1)
  8.  
  9. int n ,Q ,a[N] ,Idx[N] ,Ans[N];
  10.  
  11. class SegTree {
  12.     public:
  13.         vector<int> Seg;
  14.     private:
  15.  
  16.         int Compain(int a ,int b){
  17.             return a + b;
  18.         }
  19.  
  20.         void UPD(int i ,int v ,int p ,int L ,int R){
  21.             if( i > R || i < L ) return;
  22.             if( L == R ){
  23.                 Seg[p] = v; return;}
  24.  
  25.             int Mid = (L + R) >> 1;
  26.             UPD(i ,v ,lf ,L ,Mid);
  27.             UPD(i ,v ,rg ,Mid + 1 ,R);
  28.             Seg[p] = Compain(Seg[lf] ,Seg[rg]);
  29.         }
  30.  
  31.         int QRY(int i ,int j ,int p ,int L ,int R){
  32.             if( i >  R || j <  L ) return 0;
  33.             if( i <= L && R <= j ) return Seg[p];
  34.  
  35.             int Mid = (L + R) >> 1;
  36.             int LF = QRY(i ,j ,lf ,L ,Mid);
  37.             int RG = QRY(i ,j ,rg ,Mid + 1 ,R);
  38.             return Compain(LF ,RG);
  39.         }
  40.     public:
  41.         SegTree(int n){
  42.             Seg.assign(4 * n ,0);
  43.         }
  44.         void ReSet(){
  45.             for(auto&i:Seg)i=0;
  46.         }
  47.         void UPD(int i ,int v){
  48.             UPD(i ,v ,1 ,1 ,2*n);
  49.         }
  50.         int QRY(int L ,int R){
  51.             return QRY(L ,R ,1 ,1 ,2*n);
  52.         }
  53. };
  54.  
  55. int main() {
  56.     scanf("%d" ,&n);
  57.     SegTree ST(2*(n + 1));
  58.  
  59.     for(int i=1 ; i <= 2 * n ; i++)
  60.         scanf("%d" ,&a[i]);
  61.  
  62.     for(int i=1 ; i <= 2 * n ; i++){
  63.         if( Idx[ a[i] ] > 0 ){
  64.             ST.UPD(Idx[ a[i] ] ,0);
  65.             Q = ST.QRY(Idx[ a[i] ] ,i);
  66.             Ans[ a[i] ] = Q;
  67.             Idx[ a[i] ] = 0;
  68.         } else {
  69.             Idx[ a[i] ] = i;
  70.             ST.UPD(Idx[ a[i] ] ,1);
  71.         }
  72.     }
  73.  
  74.     ST.ReSet();
  75.     reverse(a + 1 , a + 1 + 2 * n);
  76.     for(int i=1 ; i <= 2 * n ; i++){
  77.         if( Idx[ a[i] ] > 0 ){
  78.             ST.UPD(Idx[ a[i] ] ,0);
  79.             Q = ST.QRY(Idx[ a[i] ] ,i);
  80.             Ans[ a[i] ] += Q;
  81.             Idx[ a[i] ] = 0;
  82.         } else {
  83.             Idx[ a[i] ] = i;
  84.             ST.UPD(Idx[ a[i] ] ,1);
  85.         }
  86.     }
  87.  
  88.     for(int i=1 ; i <= n ; i++)
  89.         printf("%d " ,Ans[i]);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement