-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjan21.cpp
158 lines (149 loc) · 3.6 KB
/
jan21.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
void swap(long int *a,long int *b)
{
long long int temp=*a;
*a=*b;
*b=temp;
}
int partition(long int b[],long int e[],long int l,long int h)
{
long long int x=b[h],i=l-1,j;
for(j=l;j<h;j++)
{
if(b[j]<=x)
{
i++;
swap(&b[i],&b[j]);
swap(&e[i],&e[j]);
}
}
swap(&b[i+1],&b[h]);
swap(&e[i+1],&e[h]);
return i+1;
}
void sort(long int b[],long int e[],long int l,long int h)
{
if(l<h)
{
int p=partition(b,e,l,h);
sort(b,e,l,p-1);
sort(b,e,p+1,h);
}
}
// A structure to represent an adjacency list node
struct AdjListNode
{
int dest;
struct AdjListNode* next;
};
// A structure to represent an adjacency list
struct AdjList
{
struct AdjListNode *head; // pointer to head node of list
};
// A structure to represent a graph. A graph is an array of adjacency lists.
// Size of array will be V (number of vertices in graph)
struct Graph
{
int V;
struct AdjList* array;
};
// A utility function to create a new adjacency list node
struct AdjListNode* newAdjListNode(int dest)
{
struct AdjListNode* newNode =
(struct AdjListNode*) malloc(sizeof(struct AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}
// A utility function that creates a graph of V vertices
struct Graph* createGraph(int V)
{
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;
// Create an array of adjacency lists. Size of array will be V
graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));
// Initialize each adjacency list as empty by making head as NULL
int i;
for (i = 0; i < V; ++i)
graph->array[i].head = NULL;
return graph;
}
// Adds an edge to an undirected graph
void addEdge(struct Graph* graph, int src, int dest)
{
// Add an edge from src to dest. A new node is added to the adjacency
// list of src. The node is added at the begining
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
// Since graph is undirected, add an edge from dest to src also
newNode = newAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}
int main()
{
long int no,i,j,max,n,ind,x,y,b[50000];
long int e[50000];
bool visited[50000];
scanf("%ld",&no);
while(no--)
{
scanf("%ld",&n);
for(i=1;i<=n;i++)
{
scanf("%ld",&b[i]);
e[i]=i;
}
sort(b,e,1,n);
struct Graph* graph = createGraph(n);
for(i=1;i<n;i++)
{
scanf("%ld %ld",&x,&y);
addEdge(graph,x-1,y-1);
}
for(i=0;i<graph->V;i++)
{
struct AdjListNode* pCrawl = graph->array[i].head;
long int ind_min=1,ind_max=n;
while (pCrawl)
{
if((pCrawl->dest)+1==e[ind_min])
ind_min++;
if(((pCrawl->dest)+1)==e[ind_max])
ind_max--;
if(e[ind_max]==i+1)
ind_max--;
if(e[ind_min]==i+1)
ind_min++;
pCrawl = pCrawl->next;
}
if(ind_max<ind_min)
printf("0 ");
else
{
if(e[ind_max]!=i+1)
printf("%ld ",e[ind_max]);
else if(ind_max>ind_min)
{
if(e[ind_max]!=i+1)
printf("%ld ",e[ind_max]);
else
printf("%ld ",e[ind_max-1]);
}
else if(ind_max==ind_min)
{
if(e[ind_max]!=i+1)
printf("%ld ",e[ind_max]);
else
printf("0 ");}
}
}
printf("\n");
}
return 0;
}