Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    int n,m,k,a,lewy,prawy,srodek,pomx,pomy,pom1,pom2;
    long long wynik=0;
    cin>>n>>m>>k;
    int tab1[m][2],tab2[k][2],fiolki[n+1],sortowanie[n+1];
    vector <pair<int,int> > v[n+1];
    for(int i=1;i<=n;i++)
    {
        cin>>a;
        v[i].push_back(make_pair(a,i));
        fiolki[i]=i;
    }
    for(int i=0;i<m;i++) cin>>tab1[i][0]>>tab1[i][1];
    for(int i=0;i<k;i++) cin>>tab2[i][0]>>tab2[i][1];
    for(int i=0;i<m;i++)
    {
        while(!v[tab1[i][0]].empty())
        {
            fiolki[v[tab1[i][0]].back().second]=tab1[i][1];
            v[tab1[i][1]].push_back(make_pair(v[tab1[i][0]].back().first,v[tab1[i][0]].back().second));
            v[tab1[i][0]].pop_back();
        }
        /////////////////////////////////////////////////////////////////////////////////////////
        //sortowanie element�w w fiolce
        for(int j=0;j<=n;j++) sortowanie[j]=-1;
        while(!v[tab1[i][1]].empty())
        {
            sortowanie[v[tab1[i][1]].back().second]=v[tab1[i][1]].back().first;
            v[tab1[i][1]].pop_back();
        }
        for(int j=0;j<=n;j++)
        {
            if(sortowanie[j]!=-1) v[tab1[i][1]].push_back(make_pair(sortowanie[j],j));
        }
        //////////////////////////////////////////////////////////////////////////////////////////
        for(int j=0;j<k;j++)
        {
            if(tab2[j][0]!=-1 && tab2[j][0]!=-1 && fiolki[tab2[j][0]]==fiolki[tab2[j][1]])
            {
                //wyszukiwanie binarne dla obu fiolek
                pomx=-1;
                pomy=-1;
                //////////////////////////////////////////////////////////////////////////////////
                lewy=0;
                prawy=v[fiolki[tab2[j][0]]].size()-1;
                while(lewy<=prawy)
                {
                    srodek=(lewy+prawy)/2;
                    if(v[fiolki[tab2[j][0]]][srodek].second==tab2[j][0])
                    {
                        pomx=srodek;
                        lewy=prawy+1;
                    }
                    else if (v[fiolki[tab2[j][0]]][srodek].second>tab2[j][0]) prawy=srodek-1;
                    else lewy=srodek+1;
                }
                //////////////////////////////////////////////////////////////////////////////////
                lewy=0;
                prawy=v[fiolki[tab2[j][0]]].size()-1;
                while(lewy<=prawy)
                {
                    srodek=(lewy+prawy)/2;
                    if(v[fiolki[tab2[j][0]]][srodek].second==tab2[j][1])
                    {
                        pomy=srodek;
                        lewy=prawy+1;
                    }
                    else if (v[fiolki[tab2[j][0]]][srodek].second>tab2[j][1]) prawy=srodek-1;
                    else lewy=srodek+1;
                }
                //////////////////////////////////////////////////////////////////////////////////
                //tworzy sie osad;
                if(pomx!=-1 && pomy!=-1)
                {
                    if(v[fiolki[tab2[j][0]]][pomx].first>v[fiolki[tab2[j][0]]][pomy].first)
                    {
                        wynik+=2*v[fiolki[tab2[j][0]]][pomy].first;
                        v[fiolki[tab2[j][0]]][pomx].first-=v[fiolki[tab2[j][0]]][pomy].first;
                        v[fiolki[tab2[j][0]]][pomy].first=-1;
                    }
                    else
                    {
                        wynik+=2*v[fiolki[tab2[j][0]]][pomx].first;
                        v[fiolki[tab2[j][0]]][pomy].first-=v[fiolki[tab2[j][0]]][pomx].first;
                        v[fiolki[tab2[j][0]]][pomx].first=-1;
                    }
                    tab2[j][0]=-1; tab2[j][1]=-1;
                }
                //////////////////////////////////////////////////////////////////////////////////
            }

        }
    }
    cout<<wynik;
    return 0;
}