Является ли проблема платы.
Обратите внимание, что правая сторона точки поворота, чтобы удалить правую LCA, непосредственно ID [х] изменен, чтобы добавить.
Обратите внимание, что в это время, если х == у, непосредственно возвращается.
Код выглядит следующим образом:
# include <бит / STDC ++ ч.> с использованием пространства имен STD; #define инф 2147483647 Const INT maxn = 1E6; INT п, м; рядный INT чтения () { INT х = 0 , е = 1 ; символ с = GetChar (); в то время как (с < ' 0 ' || с> ' 9 ' ) { если (с == ' - ' ) F = - 1 ; с = GetChar (); } в то время как(с> = ' 0 ' && с <= ' 9 ' ) { х = (х << 1 ) + (х << 3 ) + с- ' 0 ' ; с = GetChar (); } Вернуться х * п; } INT бек [maxn], NEX [maxn], чтобы [maxn], е; рядный недействительными добавить ( INT х, INT у) { е ++; NEX [е] = бек [х]; бек [х] = е; в [е] = у; } INT хх [maxn], уу [maxn]; ИНТсын [maxn], размер [maxn], отд [maxn], фа [maxn]; рядный недействительными dfs1 ( INT х, INT ANC) { отд [х] = DEP [ANC] + 1 ; фа [х] = КСД; Размер [х] = 1 ; для ( INT I = бек [х]; я; I = NEX [I]) { INT т = к [I]; если (т == ANC) продолжить ; dfs1 (т, х); Размер [х] + = размер [т]; если (размер [т]> размер [сын [х]]) сын [х] = т; } } INT ID [maxn], сверху [maxn], CNT; рядный недействительными dfs2 ( INT х, INT ГЭНПСК) { идентификатор [х] = ++ CNT; сверху [х] = ГЭНПСК; если (сын [х]!) возвращение ; dfs2 (сын [х], ГЭНПСК); для ( INT I = бек [х]; я; I = NEX [I]) { INT т = к [I]; если (т == фа [х] || т == сын [х]) продолжить ; dfs2 (т, т); } } INT TR [maxn], ленивый [maxn]; в соответствиинедействительныйPushup ( INT ч, INT г) { тр [ч] = мин (тр [ч], г); ленивый [ч] = мин (ленивая [ч], г); } Инлайн недействительными магазинного ( INT ч) { если (ленивая [ч] == инф) возвращение ; Pushup (ч << 1 , ленивая [ч]); Pushup (ч << 1 | 1 , ленивая [ч]); ленивая [ч] = инф; } Инлайн недействительными Modify ( INT ч, INT л, INT г, INTх, INT у, INT г) { если (л> у || г <х) возврат ; если (л> = х && г <= у) { Pushup (ч, г); вернуться ; } Магазинный (ч); INT середины = (L + R) >> 1 ; Modify (ч << 1 , л, в середине, х, у, г); изменить (ч << 1 | 1 , середина + 1 , г, х, у, г); // тр [ч] = мин (тр [ч << 1], тр [ч << 1 | 1]); } Инлайн недействительными тс ( INT х, INT у, INT г) { в то время(! сверху [х] = сверху [у]) { если (DEP [наверх [х]] < DEP [наверх [у]]) подкачки (х, у); изменить ( 1 , 1 , п, идентификатор [сверху [х]], идентификатор [х], г); х = фа [вершина [х]]; } Если (х == у) возвращение ; если (DEP [х]> DEP [у]) подкачки (х, у); изменить ( 1 , 1 , п, идентификатор [х] + 1 , ID [у], г); } / * Инлайн недействительных сборок (интермедиат ч, Int л, Int г) { тр [ч] = ленивая [ч] = инф; если (л г ==) возвращение; INT середины = (L + R) >> 1; сборки (ч << 1, л, середина); билд (ч << 1 | 1, середина + 1, г); } * / РядныйINT запроса ( INT ч, INT л, INT г, INT х) { если (л == г) возвращение тр [ч]; INT середины = (L + R) >> 1 ; магазинный (ч); если (середина> = х) возврат запроса (ч << 1 , л, в середине, х); еще обратный запрос (ч << 1 | 1 , середина + 1 , г, х); } INT основных () { // freopen ( "p.in", "г", стандартный ввод); п = следующим образом (), т = следующим образом (); для ( INT I = 0; я <= 10 * п; я ++ ) тр [I] = ленивым [I] = инф; для ( Int I = 1 ; я <п; я ++ ) { хх [г] = следующим образом (); уу [I] = следующим образом (); добавить (XX [I], уу [I]); добавить (YY [I], хх [I]); } Dfs1 ( 1 , 0 ); dfs2 ( 1 , 1 ); // сборки (1,1, п); INT х, у, г; для ( Int I = 1 ; I <= т; я ++ ) { х= чтения (), Y = следующим образом (), г = следующим образом (); тс (х, у, г); } INT АС = 0 , WA = 0 ; для ( Int I = 1 ; я <п; я ++ ) { если (DEP [XX [I]] < DEP [уу [I]]) подкачки (XX [I], YY [I]); INT TMP = запроса ( 1 , 1 , п, идентификатор [хх [I]]); TMP = (TMP == инф) - 1 : TMP; Е ( " % d \ п " , TMP); / * Х = чтения (); если (х == TMP) AC ++; остальное WA ++ Е ( "% d% d \ п", х, TMP); // Е ( "% d \ п", TMP == инф -1: TMP); * / } // Е ( "% d% d \ п", АС, WA); вернуться 0 ; }