Полдень обследование достаточно сонный задыхаться.
T1
Я хочу играть быструю матрицу питания, то я Goo
T2
Так они попали в подушки Т1.
T3
Каждая черная точка обновления ответ только два пути:
- Обновление поддерево.
- Обновление братья, дядья по материнской цепи, ......
Итак:
Дерево взял на $ ДФС $ порядка.
Обновление суб-дерево, интервал изменения.
Обновление родительской цепи, вы должны использовать DFS раскол $ $ последовательности, модифицированные две части.
#include <iostream> #include <CString> #include <cstdio> #define N 111111 #define LC (к) (к << 1) #define гс (к) (к << 1 | 1) с помощью патезрасе; структура SR { Int следующего, т; } RS [N * 2]; INT П [Н], CNT = 0; XDS структура { INT L, R; ИНТ Дат, LZ; } к.т. [4 * N]; INT пихты [N], Лас [N], ш [N]; INT dfsxu [2 * N]; INT dfcnt = 0; INT фа [N], рп, дп; BOOL is_v [N]; недействительными добавить (интермедиат F, Int т) { RS [CNT] .t = т; RS [CNT] .next = П [е]; П [е] = CNT ++; } Недействительными сборки (целое к, л INT, INT R) { // соиЬ << к << " "<< л <<"" << г << епсИ; если (л == г) возвращение; Int середине = (L + R) / 2; построить (ЖХ (к), л, средний); построить (гс (к), середина + 1, г); } Недействительной downlz (интермедиат к) { если (к.т. [к] .l = RT [к] .r && к.т. [к] = 0 формату lz!!) { INT = Val к.т. [к] формату lz; RT [ЖХ (к)] LZ = макс (к.т. [ЖХ (к)] LZ, вал.). RT [гс (к)] LZ = макс (к.т. [гс (к)] LZ, вал.). RT [ЖХ (к)] = макс DAT (RT [ЖХ (к)] DAT, вал.). RT [гс (к)] = макс DAT (RT [гс (к)] DAT, вал.). к.т. [к] = 0 формата lz; } } Пустот изменения (Int, Int K, L INT R, Int v) { если (л> г) возвращение; downlz (к); если (л <= RT [к] .l && к.т. [к] .r <= г) { к.т. [к] = v формата lz; к.т. [к] .dat = макс (к.т. [к] .dat, v); вернуть ; } INT = середина (к.т. [к] .l + КТ [к] .r) / 2; если (середина> = л) для (INT I = П [к], я = - 1;! я = RS [я] .next) { Изменение (ЖХ (к), л, г, т); если (середина <г) изменение (гс (к), л, г, т); к.т. [к] .dat = макс (к.т. [ЖХ (к)] DAT, к.т. [гс (к)] DAT..); } INT запроса (целое к, л INT, INT R) { если (л> г) возврат 0; INT ANS = 0; downlz (к); если (л <= RT [к] .l && к.т. [к] .r <= г) возвращение к.т. [к] .dat; INT = середина (к.т. [к] .l + КТ [к] .r) / 2; если (середина> = л) ANS = макс (ANS, запрос (ЖХ (к), л, г)); если (середина <г) ANS = макс (ANS, запрос (гс (к), л, г)); вернуться анс; } Недействительного ДФС (Int, Int к предварительно) { dfcnt ++; dfsxu [dfcnt] = к; ель [к] = dfcnt; INT т = RS [I] .t; (! т = заранее) , если { фа [т] = к; ДФС (т, к); } } dfcnt ++; dfsxu [dfcnt] = к; лас [к] = dfcnt; } INT основных () { // freopen ( "lca3.in", "г", STDIN); \ freopen ( "1.out", "ш", стандартный вывод); Int а, б; символ ул [10]; MemSet (й, -1, SizeOf П); зсапЕ ( "% d% d", & р, & Qn); для (INT I = 1; я <= р; я ++) Scanf ( "% d", Wi + I); для (INT = 1; г <р; я ++) { зсапЕ ( "% d% d", & а, & б); добавить (а, б); Добавить (Ь, а); } ДФС (1,0); // для (INT I = 1, г <= Pn * 2, я ++) \ соиЬ << dfsxu [I] <<»«; \ COUT << Endl; построить (1,1, рп * 2); для (INT = 1; я <= Qn; я ++) { зсапЕ ( "% S% d", ст, & а); // соиЬ << пихты [а] << "=" << лас [а] << епсИ; в то время как (фа [а] = 0) { // соиЬ << "A:" << а << "FAA: "<< фа [а] <<" ш:" << ш [фа [а]] << епсИ; изменение (1, ель [фа [а]], ель [а] -1, ш [фа [а]]); // соиЬ << пихты [фа [а]] <<»«<< пихты [а] -1 << епсИ; изменение (1, Лас [а] + 1, Лас [фа [а]], ш [фа [а]]); // соиЬ << лас [а] +1 <<»«<< лас [фа [а]] - 1 << епсИ; если (is_v [а]) перерыва; is_v [а] = 1; а = фа [а]; } } Еще { INT ANS = запрос (1, ель [а], ель [а]); Е ( "% d \ п", ANS == 0 -1: ANS);