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
#include <stdio.h>
#include <map>
#include <algorithm>
#include <iostream>

using namespace std;
int n,m,k;

map<int,map<int,int> >fiolki;

int kroki[200100][2];

int reakcje[500100][2];

int main()
{
  long long ret=0;
  scanf("%d%d%d",&n,&m,&k);
  for(int i=0;i<n;i++)
  {
    int g;
    scanf("%d",&g);
    fiolki[i+1][i+1]=g;
  }
  for(int i=0;i<m;i++)
  {
    scanf("%d%d",kroki[i],kroki[i]+1);
  }
  for(int i=0;i<k;i++)
  {
    scanf("%d%d",reakcje[i],reakcje[i]+1);
  }
  for(int i=0;i<m;i++)
  {
    int z = kroki[i][0];
    int d = kroki[i][1];
    for(int r=0;r<k;r++)
    {
      int r1 = reakcje[r][0];
      int r2 = reakcje[r][1];
      map<int,int>::iterator itz = fiolki[z].find(r1);
      map<int,int>::iterator itd = fiolki[d].find(r2);
      if(itz!=fiolki[z].end() && itd!=fiolki[d].end())
      {
        int rea = min(itz->second, itd->second);
        ret+=rea*2;
        itz->second -= rea;
        itd->second -= rea;
      }
      itz = fiolki[z].find(r2);
      itd = fiolki[d].find(r1);
      if(itz!=fiolki[z].end() && itd!=fiolki[d].end())
      {
        int rea = min(itz->second, itd->second);
        ret+=rea*2;
        itz->second -= rea;
        itd->second -= rea;
      } 
    } 
    for(map<int,int>::iterator itz = fiolki[z].begin();itz!=fiolki[z].end();itz++)
    {
      if(itz->second)
      {
        fiolki[d][itz->first]=itz->second;
      }
    }
  }
  printf("%lld\n",ret);
  return 0;
}