Advertisement
Guest User

Untitled

a guest
Jul 26th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <cstring>
  4. #include <set>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 300010;
  9.  
  10. char niz[N];
  11. int n;
  12. int len[N], dp[N][30];
  13.  
  14. vector <int> SAD;
  15. vector <int> V[N];
  16.  
  17. void dfs( int mj, int depth, int last ) {
  18.      len[mj] = depth;
  19.      dp[mj][0] = last;
  20.      
  21.      for( int i = 1; i < 20; ++i ) dp[mj][i] = dp[dp[mj][i-1]][i-1];
  22.      
  23.      for( int i = 0; i < V[mj].size(); ++i ) dfs( V[mj][i], depth+1, mj );
  24.      
  25.      return;
  26. }
  27.  
  28. int main( void ) {
  29.     scanf( "%s", &niz );
  30.     n = strlen( niz );
  31.    
  32.     SAD.push_back( 0 );
  33.     for( int i = 0; i < n; ++i ) {
  34.          if( niz[i] == '(' ) { V[ SAD[ SAD.size()-1 ] ].push_back( i+1 ); SAD.push_back( i+1 ); }
  35.          if( niz[i] == ')' ) SAD.pop_back();
  36.     }
  37.    
  38.     dfs( 0, 0, 0 );
  39.    
  40.     scanf( "%d", &n );
  41.     for( int i = 0; i < n; ++i ) {
  42.          int a, b;
  43.          scanf( "%d %d", &a, &b );
  44.          
  45.          if( len[a] < len[b] ) swap( a, b );
  46.          for( int j = 20; j >= 0; --j ) if( len[a]-( 1<<j ) >= len[b] ) a = dp[a][j];
  47.          
  48.          for( int j = 20; j >= 0; --j ) if( dp[a][j] != dp[b][j] ) { a = dp[a][j]; b = dp[b][j]; }
  49.          
  50.          if( a == b ) printf( "%d\n", a );
  51.          else printf( "%d\n", dp[a][0] );
  52.     }
  53.    
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement