BoxerTC

POLQUERY

Oct 8th, 2014
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define N 100000
  17. #define LOGN 20
  18. #define M 500000
  19.  
  20. #define test puts( "*************************test**********************" );
  21.  
  22. typedef pair< int , int > pii;
  23. typedef vector< int > vi;
  24. typedef vector< vi > vvi;
  25. typedef vector< pii > vpii;
  26.  
  27. struct bcc{
  28.     int n , m , fin , timer, nbicomp , top;
  29.     vi orig , dest , pila;//M
  30.     vvi E;//N
  31.     vi low , dfsn , part;//N
  32.     vi ponte , bicomp;//M
  33.     bcc(){}
  34.     void clear( int nodes , int edges ){
  35.         n = nodes , m = edges;
  36.         orig = dest = pila = vi( m );
  37.         E = vvi( n );
  38.         low = dfsn = part = vi( n );
  39.         ponte = bicomp = vi( m );
  40.     }
  41.     void add( int u , int v , int id ){
  42.         orig[ id ] = u;
  43.         dest[ id ] = v;
  44.         E[ u ].pb( id );
  45.         E[ v ].pb( id );
  46.     }
  47.     int dfsbcc( int u , int p = -1 ){
  48.         low[ u ] = dfsn[ u ] = ++timer;
  49.         int ch = 0;
  50.         REP( i , SZ( E[ u ] ) ){
  51.             int e = E[ u ][ i ] , v = (orig[ e ] == u? dest[ e ] : orig[ e ]);
  52.             if( dfsn[ v ] == 0 ){
  53.                 pila[ top++ ] = e;
  54.                 dfsbcc( v , u );
  55.                 low[ u ] = min( low[ u ] , low[ v ] );
  56.                 ch++;
  57.                 if( low[ v ] >= dfsn[ u ] ){
  58.                     part[ u ] = 1;
  59.                     do{
  60.                         fin = pila[ --top ];
  61.                         bicomp[ fin ] = nbicomp;
  62.                     }while( fin != e );
  63.                     nbicomp++;
  64.                 }
  65.                 if( low[ v ] == dfsn[ v ] ) ponte[ e ] = 1;
  66.             }else if( v != p && dfsn[ v ] < dfsn[ u ] ){
  67.                 pila[ top++ ] = e;
  68.                 low[ u ] = min( low[ u ] , dfsn[ v ] );
  69.             }
  70.         }
  71.         return ch;
  72.     }
  73.     void doit(){
  74.         REP( i , n ) part[ i ] = dfsn[ i ] = 0;
  75.         REP( i , m ) ponte[ i ] = 0;
  76.         top = nbicomp = timer = 0;
  77.         REP( i , n ) if( dfsn[ i ] == 0 ) part[ i ] = dfsbcc( i ) >= 2;
  78.     }
  79.    
  80.    
  81. }BCC;
  82. struct tree{
  83.     vvi rmq;//logn n
  84.     vi depth;
  85.     vi vis;
  86.     vvi G;
  87.     vi in , out;
  88.     int n , timer;
  89.     tree(){}
  90.     void clear( int nodes ){
  91.         n = nodes;
  92.         rmq = vvi( LOGN + 1 , vi( n , -1 ) );
  93.         depth = vis = vi( n );
  94.         in = out = vi( n );
  95.         G = vvi( n );
  96.         timer = 0;
  97.     }
  98.     void dfs( int u , int p = -1 ){
  99.         in[ u ] = timer ++;
  100.         vis[ u ] = 1;
  101.         REP( i , SZ( G[ u ] ) ){
  102.             int v = G[ u ][ i ];
  103.             if( v != p && !vis[ v ] ){
  104.                 rmq[ 0 ][ v ] = u;
  105.                 depth[ v ] = depth[ u ] + 1;
  106.                 dfs( v , u );
  107.             }
  108.         }
  109.         out[ u ] = timer ++;
  110.     }
  111.     void add( int u , int v ){
  112.         G[ u ].pb( v );
  113.         G[ v ].pb( u );
  114.     }
  115.     int LCA( int a , int b ){
  116.         if( depth[ a ] > depth[ b ] ) swap( a , b );
  117.         int dif = depth[ b ] - depth[ a ];
  118.         for( int i = 0 ; i <= LOGN ; ++i ) if( dif & (1<<i) ) b = rmq[ i ][ b ];
  119.         if( a == b ) return a;
  120.         for( int k = LOGN ; k >= 0 ; --k )
  121.             if( rmq[ k ][ a ] != rmq[ k ][ b ] ) a = rmq[ k ][ a ] , b = rmq[ k ][ b ];
  122.         return rmq[ 0 ][ a ];
  123.     }
  124.     void doit(){
  125.         dfs( 0 );
  126.         for( int k = 1 ; k <= LOGN ; ++k )
  127.             REP( i , n ) if( rmq[ k - 1 ][ i ] != -1 ) rmq[ k ][ i ] = rmq[ k - 1 ][ rmq[ k - 1 ][ i ] ];
  128.     }
  129.     bool isChild( int u , int v ){
  130.         return in[ u ] <= in[ v ] && out[ v ] <= out[ u ];
  131.     }
  132.     bool isInPath2( int u , int v , int x ){
  133.         return isChild( u , x ) && isChild( x , v );
  134.     }
  135.     bool isInPath( int u , int v , int x ){
  136.         int lca = LCA( u , v );
  137.         return isInPath2( lca , u , x ) || isInPath2( lca , v , x );
  138.     }
  139. }TREE;
  140.  
  141. struct graph{
  142.     vi vis;
  143.     vvi G;
  144.     int n;
  145.     vpii edges;
  146.     graph(){}
  147.     void clear( int nodes ){
  148.         edges.clear();
  149.         n = nodes;
  150.         vis = vi( n );
  151.         G = vvi( n );
  152.     }
  153.     void dfs( int u , int p = -1 ){
  154.         vis[ u ] = 1;
  155.         REP( i , SZ( G[ u ] ) ){
  156.             int v = G[ u ][ i ];
  157.             if( v != p && !vis[ v ] ){
  158.                 edges.pb( mp( u , v ) );
  159.                 dfs( v , u );
  160.             }
  161.         }
  162.     }
  163.     void add( int u , int v ){
  164.         G[ u ].pb( v );
  165.         G[ v ].pb( u );
  166.     }
  167.     void doit(){
  168.         REP( i , n ) if( !vis[ i ] ) dfs( i );
  169.     }
  170. }GRAPH;
  171. int main(){
  172.  
  173.     int n , m;
  174.     while( sc( n ) == 1 ){
  175.         sc( m );
  176.         BCC.clear( n , m );
  177.         GRAPH.clear( n );
  178.         TREE.clear( n );
  179.        
  180.         map< pii , int > EDGES;
  181.         REP( i , m ){
  182.             int u , v ;
  183.             sc( u ) , sc( v );
  184.             u -- , v --;
  185.             BCC.add( u , v , i );
  186.             GRAPH.add( u , v );
  187.             if( u > v ) swap( u , v );
  188.             EDGES[ mp( u , v ) ] = i;
  189.         }
  190.        
  191.         GRAPH.doit();
  192.         BCC.doit();
  193.        
  194.         vpii &edges = GRAPH.edges;
  195.         REP( i , SZ( edges ) ) TREE.add( edges[ i ].fi , edges[ i ].se );
  196.         TREE.doit();
  197.         int Q;
  198.         sc( Q );
  199.         REP( q , Q ){
  200.             int op;
  201.             sc( op );
  202.             if( op == 1 ){
  203.                 int a , b , s , t;
  204.                 sc( a ) , sc( b ) , sc( s ) , sc( t );
  205.                 a -- , b -- , s -- , t --;
  206.                 if( s > t ) swap( s , t );
  207.                 int id = EDGES[ mp( s , t ) ];
  208.                 if( !BCC.ponte[ id ] ){
  209.                     puts( "ne" );
  210.                     continue;
  211.                 }
  212.                 if( TREE.isInPath( a , b , s ) && TREE.isInPath( a , b , t ) ) puts( "da" );
  213.                 else puts( "ne" );
  214.             }else{
  215.                 int a , b , x;
  216.                 sc( a ) , sc( b ) , sc( x );
  217.                 a -- , b -- , x --;
  218.                 if( !BCC.part[ x ] ){
  219.                     puts( "ne" );
  220.                     continue;
  221.                 }
  222.                 if( TREE.isInPath( a , b , x ) ) puts( "da" );
  223.                 else puts( "ne" );
  224.             }
  225.         }
  226.     }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment