Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <set>
- #include <algorithm>
- using namespace std;
- const int N = 300010;
- char niz[N];
- int n;
- int len[N], dp[N][30];
- vector <int> SAD;
- vector <int> V[N];
- void dfs( int mj, int depth, int last ) {
- len[mj] = depth;
- dp[mj][0] = last;
- for( int i = 1; i < 20; ++i ) dp[mj][i] = dp[dp[mj][i-1]][i-1];
- for( int i = 0; i < V[mj].size(); ++i ) dfs( V[mj][i], depth+1, mj );
- return;
- }
- int main( void ) {
- scanf( "%s", &niz );
- n = strlen( niz );
- SAD.push_back( 0 );
- for( int i = 0; i < n; ++i ) {
- if( niz[i] == '(' ) { V[ SAD[ SAD.size()-1 ] ].push_back( i+1 ); SAD.push_back( i+1 ); }
- if( niz[i] == ')' ) SAD.pop_back();
- }
- dfs( 0, 0, 0 );
- scanf( "%d", &n );
- for( int i = 0; i < n; ++i ) {
- int a, b;
- scanf( "%d %d", &a, &b );
- if( len[a] < len[b] ) swap( a, b );
- for( int j = 20; j >= 0; --j ) if( len[a]-( 1<<j ) >= len[b] ) a = dp[a][j];
- for( int j = 20; j >= 0; --j ) if( dp[a][j] != dp[b][j] ) { a = dp[a][j]; b = dp[b][j]; }
- if( a == b ) printf( "%d\n", a );
- else printf( "%d\n", dp[a][0] );
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement