#include"iostream" #include"algorithm" #include"cstring" #include"cstdio" #include"cmath" #include"vector" #include"map" #include"set" #include"bitset" #include"queue" #include"unordered_map" usingnamespace std; #define MAXN 1036 //#define int long long #define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i) #define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i) #define pii pair<int,int> #define fi first #define se second #define mp make_pair #define pb push_back #define eb emplace_back #define vi vector<int> #define all(x) (x).begin() , (x).end() #define mem( a ) memset( a , 0 , sizeof a ) typedeflonglong ll; constint P = 418254373; constint base = 332; int n , s , d; int A[MAXN];
#include"iostream" #include"algorithm" #include"cstring" #include"cstdio" #include"cmath" #include"vector" #include"map" #include"set" #include"queue" usingnamespace std; #define MAXN 600046 //#define int long long #define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i) #define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i) #define pii pair<int,int> #define fi first #define se second #define mp make_pair #define pb push_back #define eb emplace_back #define vi vector<int> #define all(x) (x).begin() , (x).end() #define mem( a ) memset( a , 0 , sizeof a ) typedeflonglong ll; int n , m; int A[MAXN];
vi G[MAXN]; int dfn[MAXN] , bc[MAXN] , clo; int g[MAXN][20] , dep[MAXN];
voiddfs( int u ){ dfn[u] = ++ clo , bc[clo] = u; if( u == 1 ) dep[u] = 1; for( int v : G[u] ) { g[v][0] = u; dep[v] = dep[u] + 1; rep( k , 1 , 18 ) if( g[g[v][k - 1]][k - 1] ) g[v][k] = g[g[v][k - 1]][k - 1]; elsebreak; dfs( v ); } }
intlca( int u , int v ){ if( dep[u] < dep[v] ) swap( u , v ); if( dep[u] != dep[v] ) per( k , 18 , 0 ) if( dep[g[u][k]] >= dep[v] ) u = g[u][k]; if( u == v ) return u; per( k , 18 , 0 ) if( g[u][k] != g[v][k] ) u = g[u][k] , v = g[v][k]; return g[u][0]; }
intdis( int u , int v ){ return dep[u] + dep[v] - 2 * dep[lca( u , v )]; }
set<int> S;
voidsolve(){ cin >> n; ++ n; rep( i , 2 , n ) { int p; scanf("%d",&p); G[p].pb( i ); } dfs( 1 ); int s = 1 , t = 1 , lt = 0; auto wkr = [&]( int x ) { returnmax( dis( x , s ) , dis( x , t ) ); }; S.insert( 1 ); rep( i , 2 , n ) { int is = dis( i , s ) , it = dis( i , t ) , flg = 0; if( is >= lt && is >= it ) t = i , lt = is , flg = 1; elseif( it >= lt && it >= is ) s = i , lt = it , flg = 1; if( !flg ) { printf("%d\n",(int)S.size()); continue; } auto tr = S.lower_bound( dfn[i] ) , st = tr; while( tr != S.end() ) { if( wkr( bc[*tr] ) < lt ) ++ tr; elsebreak; } if( tr == S.end() ) { auto sr = S.begin(); while( sr != st ) { if( wkr( bc[*sr] ) < lt ) ++ sr; elsebreak; } S.erase( S.begin() , sr ); } S.erase( st , tr ); tr = S.lower_bound( dfn[i] ) , st = tr; while( tr != S.begin() ) { -- tr; if( wkr( bc[*tr] ) >= lt ) { ++ tr; break; } } if( tr == S.begin() ) { auto sr = S.end(); while( sr != st ) { -- sr; if( wkr( bc[*sr] ) >= lt ) { ++ sr; break; } } S.erase( sr , S.end() ); } S.erase( tr , st ); S.insert( dfn[i] ); // for( int x : S ) printf("%d ",bc[x]); puts(""); printf("%d\n",(int)S.size()); } }
#include"iostream" #include"algorithm" #include"cstring" #include"cstdio" #include"cmath" #include"vector" #include"map" #include"set" #include"queue" usingnamespace std; #define MAXN 106 //#define int long long #define rep(i, a, b) for (int i = (a), i##end = (b); i <= i##end; ++i) #define per(i, a, b) for (int i = (a), i##end = (b); i >= i##end; --i) #define pii pair<int,int> #define fi first #define se second #define mp make_pair #define pb push_back #define eb emplace_back #define vi vector<int> #define all(x) (x).begin() , (x).end() #define mem( a ) memset( a , 0 , sizeof a ) typedeflonglong ll;
voidsolve(){ cin >> n >> m; rep( i , 0 , n - 1 ) { scanf("%s",S[i]); } queue<pii> Q; Q.emplace( 0 , 0 ); int vx = 0 , vy = 0 , fuck = 0; while( !Q.empty() ) { int x = Q.front().fi , y = Q.front().se; Q.pop(); int tx = ( x % n + n ) % n , ty = ( y % m + m ) % m; if( !vis[tx][ty] ) { if( tx == 5 && ty == 4 ) printf(""); vis[tx][ty] = 1; ps[tx][ty] = mp( x , y ); rep( d , 0 , 3 ) { int xx = x + dx[d] , yy = y + dy[d]; int px = ( xx % n + n ) % n , py = ( yy % m + m ) % m; if( S[px][py] != '#' ) Q.emplace( xx , yy ); } } else { if( tx == 5 && ty == 4 ) printf(""); int dx = x - ps[tx][ty].fi , dy = y - ps[tx][ty].se; if( !vx && !vy ) vx = dx , vy = dy; elseif( dx * 1ll * vy != dy * 1ll * vx ) fuck = 1; } } cin >> q; rep( i , 1 , q ) { int x , y; scanf("%d%d",&x,&y); int px = ( x % n + n ) % n , py = ( y % m + m ) % m; if( !vis[px][py] ) puts("no"); elseif( fuck ) puts("yes"); else { int dx = x - ps[px][py].fi , dy = y - ps[px][py].se; if( dx * 1ll * vy == dy * 1ll * vx ) puts("yes"); elseputs("no"); } } }