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
#include <stdio.h>
#include <stdlib.h>

typedef struct {int a,b,k,l;} q;

int g[200000],p[200000],l[200000];
q r[500000];

int o(const void *a, const void *b)
{
  int i=(*(q*)a).l-(*(q*)b).l;
  if (i) return i;
  return (*(q*)a).k-(*(q*)b).k;
}

int main()
{
  int n,m,k,i;
  long long w=0;
  scanf("%d%d%d",&n,&m,&k);
  for (i=0;i<n;i++) scanf("%d",&g[i]), p[i]=i, l[i]=m;
  for (i=0;i<m;i++)
  {
    int a,b;
    scanf("%d%d",&a,&b); a--,b--;
    p[a]=b;
    l[a]=i;
  }
  for (i=0;i<k;i++)
  {
    int c,d,q=m;
    scanf("%d%d",&c,&d); c--,d--;
    r[i].a=c; r[i].b=d; r[i].k=i;
    while (l[c]!=l[d]) l[c]<l[d]? (q=l[c],c=p[c]): (q=l[d],d=p[d]);
    r[i].l=p[c]==p[d]? q: m;
  }
  qsort(r,k,sizeof(*r),o);
  for (i=0;i<k&&r[i].l<m;i++)
  {
    int a=r[i].a,b=r[i].b;
    int c=g[a]<g[b]?g[a]:g[b];
    g[a]-=c;
    g[b]-=c;
    w+=c+c;
  }
  printf("%lld\n",w);
  return 0;
}