Тема ссылка: Л Гу
Во-первых, мы считаем отсутствие операции вывода, следует рассматривать в качестве каждой строки и каждого столбца в точке (так называемый белая точка представляет собой строку, от имени столбцов называют черные пятна), каждая точка Ф (х, у) $ рассматривается как ребро.
Расширение операции на самом деле $ x_1 $ строк и $ y_1, y_2 колонке $ Unicom, когда $ x_2 $ строки и столбцы $ $ y_1 Unicom, линия также $ x_2 $ $ $ y_2 строка с China Unicom.
Unicom в том же блоке черной точки и белой точки будет производить вклад, так что даже стороны операций запроса + (количество черных точек * точка белого номер) каждый блок линии связи может быть использован непересекающимся-набор техническое обслуживание.
Теперь рассмотреть вопрос о снятии операции, на самом деле, эквивалент каждого ребра в $ [Т_1, t_2] $ на этот раз, «вклад» рассмотреть построение дерева линии о времени, $ [t_1, t_2] $ сплит журнал интервалы, а затем соединить эти грани, соответствующие краям интервалы войти концентрации в пределах этого диапазона указывает интервал этого края «вклад».
Затем, когда дерево ДФС сегмента, ДФС каждый интервал времени до $ [L, R] $ будет установить боковые грани, соответствующие секции добавляется непересекающиеся-набор, чтобы исключить время воздействия для выхода.
В самом деле, для большинства не-Амортизируемых структур времени данных быстро отозваны, не пересекается набор, а также. Вы не можете использовать сжатие пути, чтобы использовать слияние ранга.
Временная сложность $ (п \ лог ^ 2n) $ O
1 #include <. Бит / STDC ++ H> 2 #define Ринт регистре INT 3 #define фи первый 4 #define себе второй 5 #define т.пл make_pair 6 с использованием пространства имен STD; 7 ЬурейеЕ длинные длинные Л.Л.; 8 ЬурейиЙ пар < INT , INT > PII; 9 Const INT N = 600003 ; 10 INT кв, фа [N], Siz [N] , [ 2 ], сверху; 11 Карта <PII, INT >ма; 12 вектор <PII> VEC [Н << 2 ]; 13 МР ANS, ansx [N]; 14 инлайн INT getfa ( INT х) { 15 возврата х == фа [х]? х: getfa (фа [х]); 16 } 17 PII дие [N]; 18 инлайн недействительными гребенчатый ( INT х, INT у) { 19 х = getfa (х); у = getfa (у); 20 , если (х == у) возврата ; 21 , если (Siz [х] [ 0 ] + Siz [х] [ 1 ] <Siz [у] [ 0] + [Y] , [ 1 ]) подкачки (х, у); 22 ANS + = (LL) [х] [ 0 ] * [Y] [ 1 ] + (МР) [х] [ 1 ] * [у] [ 0 ]; 23 [х] [ 0 ] + [Y] = [ 0 ]; 24 [х] [ 1 ] + [Y] = [ 1 ]; 25 только [Y] = х; 26 дие [++] = тр (х, у); 28, 27 } инлайн недействительными отмены ( INT х, INT у) { 29 только [у] = у; 30 вы [х] [ 0 ] - = вы [у] [ 0 ]; 31 вы [х] [ 1 ] - = вы [у] [ 1 ]; 32 ANS - = (LL) вы [х] [ 0 ] * вы [у] [ 1 ] + (LL) вы [х] [ 1 ] * вы [у] [ 0 ]; 33 } 34 инлайн недействительным обновление ( INT х, INT L INT R, INT л, INT г, PII вал) { 35 , если (л <= L && R <= г) { 36 Vec [х] Pushback (доска) ; 37 возвращение; 38 } 39 INT середины = L + R >> 1 ; 40 , если (л <= середина) обновление (х << 1 , L, середина, L, R, вал); 41 , если (середина <г) обновление (х << 1 | 1 , середина + 1 , R, L, R, вал); 42 } 43 встроенных пустот в глубину ( INT х, INT L, INT R) { 44 INT Теперь = сверху; 45 для (PII TMP: VEC [х]) 46 гребенки (tmp.fi, tmp.se); 47 , если(L == R) ansx [L] = анс; 48 еще { 49 ИНТ середине = L + R >> 1 ; 50 ДФС (х << 1 , L, середина); ДФС (х << 1 | 1 , середина + 1 , R); 51 } 52 в то время как (сверху> сейчас) { 53 отменить (дие [наверх] .fi, дие [наверх] .se); - сверху; 54 } 55 } 56 INT основных () { 57 зсапЕ ( " % d " , & д); 58 для (Ринт я =1 ; я <= д; я ++ ) { 59 INT х, у; 60 зсапЕ ( " % d% d " , & х, & у); у + = 3e5; 61 , если ма [тр (х, у)] = (ma.count (тр (х, у))!) Я; 62 еще { 63 обновление ( 1 , 1 , кв, ма [тр (х, у)], I - 1 , тр (х, у)); 64 ma.erase (тр (х, у)); 65 } 66 } 67 для (авто он = ma.begin (); это = ma.end (!), Это ++ ) 68 обновления ( 1 ,1 , д, это -> се, д, это -> фи); 69 для (Rint I = 1 ; я <= 3e5; я ++) фа [I] = I, SIZ [I] [ 0 ] = 1 ; 70 для (Ринт я = 3e5 + 1 ; г <= 6e5; я ++) фа [I] = я, Siz [I] [ 1 ] = 1 ; 71 ДФС ( 1 , 1 , кв); 72 для (Rint I = 1 ; я <= д; я ++) Е ( " % LLD \ п " , ansx [I]); 73 }