#include <stdio.h> #include <stdlib.h> #define Q_MAX 100000 int num[100000]; int map[1000000],next[1000000]; int end; int head[100000]; int map2[1000000],next2[1000000]; int end2; int head2[100000]; int min[100000],max[100000]; int used[100000]; int queue[Q_MAX]; int h,r; void add(int a,int b) { map[end] = b; next[end] = head[a]; head[a] = end++; } void add2(int a,int b) { map2[end2] = b; next2[end2] = head2[a]; head2[a] = end2++; } void enqueue(int k) { if(used[k]) { return; } used[k] = 1; queue[r] = k; r = (r + 1) % Q_MAX; } int pop(void) { int t; t = queue[h]; used[t] = 0; h = (h + 1) % Q_MAX; return t; } int main(void) { int i,j; int n,m; int a,b,c; int ans; scanf("%d%d",&n,&m); for(i = 0;i < n;i++) { head[i] = head2[i] = -1; max[i] = -10000; min[i] = 0xFFFFFFF; scanf("%d",&num[i]); } for(i = 0;i < m;i++) { scanf("%d%d%d",&a,&b,&c); a--;b--; if(c == 2) { add(a,b);add(b,a); add2(a,b);add2(b,a); } else { add(a,b);add2(b,a); } } min[0] = num[0]; enqueue(0); while(h != r) { i = pop(); for(a = head[i];a != -1;a = next[a]) { j = map[a]; if(min[j] > min[i]) { min[j] = min[i]; enqueue(j); } if(min[j] > num[j]) { min[j] = num[j]; enqueue(j); } } } max[n - 1] = num[n - 1]; enqueue(n-1); while(h != r) { i = pop(); for(a = head2[i];a != -1;a = next2[a]) { j = map2[a]; if(max[j] < max[i]) { max[j] = max[i]; enqueue(j); } if(max[j] < num[j]) { max[j] = num[j]; enqueue(j); } } } for(i = ans = 0;i < n;i++) { if(ans < max[i] - min[i]) ans = max[i] - min[i]; } printf("%d\n",ans); return 0; } /************************************************************** Problem: 2290 User: admin Language: C Result: Accepted Time:305 ms Memory:19508 kb ****************************************************************/