青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

gzwzm06

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  1 隨筆 :: 52 文章 :: 17 評論 :: 0 Trackbacks
  1#include <cstdio>
  2
  3const int SIZE = 100001;
  4const int INF = 10000000;
  5
  6int N, arr_sc[SIZE], arr_order[SIZE], arr_index[SIZE], edge[SIZE][2], father[SIZE];
  7
  8struct NODE
  9{
 10    int m_v;
 11    struct NODE* next;
 12}
tree[SIZE], mem[SIZE * 2];
 13
 14int index = 0, M = 0, tId = 1;
 15int gMax, gMin;
 16
 17struct ITEM
 18{
 19    int fst;
 20    int last;
 21}
arr_pos[SIZE];
 22
 23struct STREE
 24{
 25    int m_start;
 26    int m_end;
 27
 28    int m_max;
 29    int m_min;
 30    int m_markMin;
 31    int m_markMax;
 32
 33    int m_leftChild;
 34    int m_rightChild;
 35}
stree[SIZE * 2];
 36
 37void Insert(const int& x, const int& y)
 38{
 39    mem[index].m_v = y;
 40    mem[index].next = tree[x].next;
 41    tree[x].next = &mem[index];
 42    index++;
 43
 44    mem[index].m_v = x;
 45    mem[index].next = tree[y].next;
 46    tree[y].next = &mem[index];
 47    index++;
 48}

 49
 50void DFS( const int &root, const int& fat )
 51{
 52    NODE *ptr = tree[root].next;
 53    
 54    arr_pos[root].fst = M;
 55    arr_index[root] = M;
 56    arr_order[M++= root;
 57    father[root] = fat;
 58
 59    while ( ptr )
 60    {
 61        if ( ptr->m_v != fat )
 62        {
 63            DFS( ptr->m_v, root );
 64        }

 65        ptr = ptr->next;
 66    }

 67
 68    arr_pos[root].last = M - 1;
 69}

 70
 71void Build(const int& id, const int& s, const int& e)
 72{
 73    stree[id].m_start = s;
 74    stree[id].m_end = e;
 75    stree[id].m_max = 0;
 76    stree[id].m_min = INF;
 77    stree[id].m_markMax = -1;
 78    stree[id].m_markMin = -1;
 79    if ( s == e )
 80    {
 81        return;
 82    }

 83
 84    int mid = (s + e) >> 1;
 85
 86    stree[id].m_leftChild = tId++;
 87    Build( stree[id].m_leftChild, s, mid );
 88
 89    stree[id].m_rightChild = tId++;
 90    Build( stree[id].m_rightChild, mid + 1, e );
 91}

 92
 93void InsertTree(const int& id, const int& p, const int& v)
 94{
 95    if ( stree[id].m_max < v )
 96    {
 97        stree[id].m_max = v;
 98        stree[id].m_markMax = arr_order[p];
 99    }

100    if ( stree[id].m_min > v )
101    {
102        stree[id].m_min = v;
103        stree[id].m_markMin = arr_order[p];
104    }

105
106    if ( stree[id].m_start == p && stree[id].m_end == p )
107    {
108        return;
109    }

110
111    int mid = (stree[id].m_start + stree[id].m_end) >> 1;
112
113    if ( mid >= p )
114        InsertTree( stree[id].m_leftChild, p, v );
115    else
116        InsertTree( stree[id].m_rightChild, p, v );
117}

118
119void Change( const int& id, const int& p, const int& v )
120{
121    if ( stree[id].m_markMax == arr_order[p] )
122    {
123        stree[id].m_max = 0;
124        stree[id].m_markMax = -1;
125    }

126    if ( stree[id].m_markMin == arr_order[p] )
127    {
128        stree[id].m_min = INF;
129        stree[id].m_markMin = -1;
130    }

131
132    if ( stree[id].m_leftChild == p && stree[id].m_rightChild == p )
133    {
134        stree[id].m_max = stree[id].m_min = v;
135        stree[id].m_markMax = stree[id].m_markMin = arr_order[p];
136        return;
137    }

138
139    int mid = (stree[id].m_start + stree[id].m_end) >> 1;
140
141    if ( mid >= p )
142    {
143        Change( stree[id].m_leftChild, p, v );
144    }

145    else {
146        Change( stree[id].m_rightChild, p, v );
147    }

148
149    int tf = stree[id].m_leftChild, tr = stree[id].m_rightChild, tmark, ts;
150    
151    ts = (stree[tf].m_max > stree[tr].m_max ? stree[tf].m_max : stree[tr].m_max);
152    tmark = (stree[tf].m_max > stree[tr].m_max ? stree[tf].m_markMax : stree[tr].m_markMax );
153    if ( stree[id].m_max < ts )
154    {
155        stree[id].m_max = ts;
156        stree[id].m_markMax = tmark;
157    }

158
159    ts = (stree[tf].m_min < stree[tr].m_min ? stree[tf].m_min : stree[tr].m_min);
160    tmark = (stree[tf].m_min < stree[tr].m_min ? stree[tf].m_markMin : stree[tr].m_markMin );
161    if ( stree[id].m_min > ts )
162    {
163        stree[id].m_min = ts;
164        stree[id].m_markMin = tmark;
165    }

166
167}

168
169void Query(const int& id, const int& s, const int& e)
170{
171    if ( s == stree[id].m_start && e == stree[id].m_end )
172    {
173        if ( gMax < stree[id].m_max )
174            gMax = stree[id].m_max;
175        if ( gMin > stree[id].m_min )
176            gMin = stree[id].m_min;
177
178        return;
179    }

180
181    int mid = (stree[id].m_start + stree[id].m_end) >> 1;
182
183    if ( mid >= e )
184    {
185        Query( stree[id].m_leftChild, s, e );
186    }

187    else if ( mid < s )
188    {
189        Query( stree[id].m_rightChild, s, e );
190    }

191    else {
192        Query( stree[id].m_leftChild, s, mid );
193        Query( stree[id].m_rightChild, mid + 1, e );
194    }

195}

196
197void Solve(const int& ep)
198{
199    gMax = 0;
200    gMin = INF;
201
202    __int64 ans;
203    int x, y, s, e;
204
205    x = edge[ep][0], y = edge[ep][1];
206
207    if ( y == father[x] )
208        y = x;
209
210    s = arr_pos[y].fst;
211    e = arr_pos[y].last;
212
213    if ( s == e )
214    {
215        gMax = gMin = arr_sc[y];
216    }

217    else {
218        Query( 0, s, e );
219    }

220
221    ans = gMax * gMin;
222
223    gMax = 0;
224    gMin = INF;
225
226    if ( s > 0 )
227        Query( 00, s - 1 );
228
229    if ( e + 1 <= M - 1 )
230        Query( 0, e + 1, M - 1 );
231
232    ans += gMax * gMin;
233
234    printf("%I64d\n", ans);
235
236}

237
238void Init()
239{
240    int i;
241
242    for ( i = 0; i < SIZE; ++i )
243        tree[i].next = NULL;
244
245    index = 0;
246    tId = 1;
247    M = 0;
248}

249
250int main()
251 {
252     freopen("1.txt""r", stdin);
253
254     int cs;
255     int i, x, y, Q;
256     char cmd[10];
257
258     scanf("%d"&cs);
259
260     while ( cs-- )
261     {
262         scanf("%d %d"&N, &Q);
263
264         for ( i = 1; i <= N; ++i )
265         {
266             scanf("%d"&arr_sc[i]);
267         }

268
269         Init();
270         Build( 00, N - 1 );
271
272         for ( i = 0; i < N - 1++i )
273         {
274             scanf("%d %d"&x, &y);
275
276             edge[i + 1][0= x;
277             edge[i + 1][1= y;
278             Insert( x, y );
279         }

280
281         father[1= -1;
282         DFS( 1-1 );
283
284         for ( i = 0; i < M; ++i )
285         {
286             int t = arr_order[i];
287             InsertTree( 0, i, arr_sc[t] );
288         }

289
290         for ( i = 0; i < Q; ++i )
291         {
292             scanf("%s", cmd);
293
294             if ( cmd[0== 'Q' )
295             {
296                 scanf("%d"&x);
297            
298                 Solve( x );
299             }

300             else if ( cmd[0== 'C' )
301             {
302                 scanf("%d %d"&x, &y);
303                 arr_sc[x] = y;
304                 Change( 0, arr_index[x], y ); 
305             }

306         }

307     }

308     
309     return 0;
310 }

311
posted on 2009-05-20 00:13 閱讀(317) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品第一区二区三区| 日韩手机在线导航| 欧美精品在线一区二区| 欧美一级久久久久久久大片| 久久久人人人| 欧美专区在线观看| 欧美另类亚洲| 亚洲国产精品久久久久婷婷884 | 久久久99久久精品女同性| 一区在线影院| 久久性色av| 噜噜爱69成人精品| 欧美一二区视频| 国产日韩欧美自拍| 嫩草国产精品入口| 永久免费精品影视网站| 欧美四级剧情无删版影片| 国产精品福利在线观看网址| 国产精品日本| 国产一二精品视频| 亚洲二区免费| 亚洲美女在线国产| 亚洲私人影吧| 久久精品国产一区二区三| 性视频1819p久久| 国产精品久久二区二区| 一本色道久久88综合亚洲精品ⅰ| 亚洲毛片在线观看| 欧美精品成人一区二区在线观看| 暖暖成人免费视频| 欧美日韩一区二区在线视频 | 亚洲精品1区| 欧美专区18| 欧美aaaaaaaa牛牛影院| 最近中文字幕mv在线一区二区三区四区| 久久av二区| 欧美激情欧美激情在线五月| 亚洲高清在线观看一区| 欧美大色视频| 99视频精品免费观看| 午夜国产精品视频免费体验区| 国产精品嫩草99av在线| 午夜在线视频观看日韩17c| 久久―日本道色综合久久| 伊人久久大香线蕉av超碰演员| 麻豆国产精品va在线观看不卡| 一本色道久久88精品综合| 午夜精品国产| 国产精品毛片a∨一区二区三区|国 | 欧美日韩国产成人精品| 欧美理论片在线观看| 美女爽到呻吟久久久久| 亚洲电影欧美电影有声小说| 在线亚洲激情| 欧美a级片网站| 国产自产女人91一区在线观看| 一区二区三区福利| 久久久精品国产免大香伊| 日韩图片一区| 免费观看亚洲视频大全| 国产亚洲精品一区二区| 一区二区欧美国产| 欧美成人自拍视频| 欧美亚洲综合在线| 欧美亚洲第一区| 亚洲精品视频免费在线观看| 久久久夜夜夜| 亚洲欧美日韩系列| 国产精品久久久久一区二区三区共 | 亚洲精品一区二区在线观看| 久久精品国产在热久久 | 亚洲国产综合91精品麻豆| 欧美中文字幕不卡| 亚洲最快最全在线视频| 欧美大片在线观看| 亚洲第一精品影视| 久久久久久国产精品mv| 亚洲一级特黄| 欧美日韩一级视频| 亚洲精选中文字幕| 亚洲第一精品久久忘忧草社区| 欧美在线短视频| 国产欧美一区二区三区在线老狼| 亚洲综合电影| 一本一道久久综合狠狠老精东影业| 欧美91视频| 91久久精品国产91久久性色tv | 亚洲社区在线观看| 欧美美女操人视频| 亚洲精品女av网站| 亚洲第一页自拍| 葵司免费一区二区三区四区五区| 狠狠88综合久久久久综合网| 久久精品国产亚洲aⅴ| 午夜免费电影一区在线观看 | 午夜精品短视频| 亚洲午夜伦理| 国产精品一区二区三区观看| 翔田千里一区二区| 亚洲欧美另类久久久精品2019| 国产精品美女一区二区在线观看| 亚洲男同1069视频| 亚洲一区二区三区四区中文| 国产精品视频一二三| 性欧美精品高清| 午夜免费电影一区在线观看| 国产一区二区精品| 老司机精品导航| 欧美jizzhd精品欧美喷水| 亚洲精品影视在线观看| 亚洲靠逼com| 国产精品sm| 久久精品国产99精品国产亚洲性色| 欧美在线视频免费观看| 在线观看国产欧美| 亚洲黄色大片| 欧美性大战久久久久久久蜜臀| 亚洲摸下面视频| 欧美一区二区在线| 在线欧美日韩国产| 亚洲人成在线播放| 国产精品久久久免费| 久久精品免费观看| 美女久久一区| 亚洲午夜久久久久久久久电影院| 亚洲专区一区二区三区| 狠狠色伊人亚洲综合成人| 亚洲丰满在线| 欧美性大战xxxxx久久久| 欧美一区二区三区免费看| 久久狠狠亚洲综合| 亚洲精品少妇30p| 亚洲午夜极品| 亚洲高清一二三区| 日韩视频免费在线| 国产亚洲在线观看| 亚洲国产精品成人综合| 国产精品嫩草影院av蜜臀| 久久亚洲春色中文字幕| 欧美激情视频一区二区三区在线播放| 亚洲欧美日韩综合一区| 久久综合伊人77777| 亚洲午夜电影| 久久这里有精品15一区二区三区| 亚洲午夜久久久久久尤物| 久久精品一区二区三区不卡| 一区二区三区精品国产| 久久精品国产精品亚洲精品| 一区二区欧美在线观看| 久久精品av麻豆的观看方式| 亚洲视频网站在线观看| 久久精品国产一区二区三区免费看| 一本色道久久88综合亚洲精品ⅰ | 国产午夜久久| 欧美成人免费大片| 国产精品日韩电影| 亚洲福利视频一区| 国产欧美日韩精品专区| 亚洲电影免费观看高清完整版在线| 国产精品久线观看视频| 欧美激情网站在线观看| 国产精品日本| 美女精品在线| 国产精品一区二区三区乱码| 亚洲精品免费网站| 亚洲国产成人91精品 | 国产日韩精品视频一区| 亚洲精品视频中文字幕| 亚洲国产导航| 欧美一区二区在线播放| 亚洲欧美色一区| 欧美日本一道本| 欧美电影免费观看大全| 红桃视频欧美| 午夜精品在线| 亚洲影音一区| 欧美日韩成人一区| 欧美激情一区二区| 在线观看亚洲a| 性色av一区二区三区红粉影视| 亚洲午夜久久久久久久久电影院| 欧美大片91| 欧美激情国产精品| 伊人男人综合视频网| 欧美在线不卡| 久久久久久久久久看片| 国产乱码精品一区二区三| 亚洲社区在线观看| 亚洲一区bb| 欧美日韩亚洲国产一区| 亚洲日韩成人| 亚洲美女中文字幕| 欧美大秀在线观看| 亚洲第一区在线| 亚洲国产精品视频一区| 久久琪琪电影院| 免费试看一区| 亚洲国产99| 女人天堂亚洲aⅴ在线观看| 免费在线看成人av|