19-10-19-I

Полдень обследование достаточно сонный задыхаться.

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);

рекомендация

отwww.cnblogs.com/kalginamiemeng/p/Exam20191019.html