Untitled

 avatar
unknown
c_cpp
4 years ago
5.9 kB
3
Indexable
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define     ll           long long
#define     ld           long double
#define     sz(s)        s.size()
#define     pb           push_back
#define     ff           first
#define     ss           second
#define     mk           make_pair
#define     pii          pair<int, int>
#define     pll          pair<long long int, long long int>
#define     ALL(s)       (s).begin(), (s).end()
#define     rALL(s)      (s).rbegin(), (s).rend()
#define     fast         ios_base::sync_with_stdio(false);cin.tie(NULL)
#define     show(x)      cout << #x << " : "<< x << endl;
#define     F(ip, ii, n) for(ll ip=ii; ip<n; ip++)
#define     vll(v,n)     for (ll i=0;i<n;i++){ll a;cin >> a;v.push_back(a);}
#define     fill(c, n)   cout <<setfill(c)<<setw(n)
#define     rPQ          vector<ll>, greater<ll>
#define     rARR         greater<int>()

#define     gcd(a, b)    __gcd(a, b)
#define     lcm(a, b)    ((a)*((b)/gcd(a,b)))
#define     limit        -pow(2, 32)
#define     range       100000 //primes
#define     mod         1052 // modulous
#define     PI          3.1415926535897


using namespace std;

typedef tree < int, null_type, less < int >, rb_tree_tag, tree_order_statistics_node_update > indexed_set;//*(x.find_by_order(i)),x.order_of_key(k)

     /// _____________________________________________________ ///
ll bigmod(ll n,ll p){if(p==0) return 1;if(p==1)return (n)%mod;if(p%2)return (bigmod(n,p-1)*n)%mod;else{ll x=bigmod(n,p/2);return (x*x)%mod;}}
ll power(ll n,ll p){if(p==0) return 1;if(p==1)return n;if(p%2)return power(n,p-1)*n;else{ll x=power(n,p/2);return x*x;}}
ll modinverse(ll n){return bigmod(n,mod-2)%mod;}
ll Check(ll n,ll i){return (n&(1LL<<i));}
ll Set(ll n,ll i){return (n|(1LL<<i));}
ll status[(ll)range/64+5];vector<ll>primes;void sieve(){for(ll i=3;i<=sqrt(range);i+=2){if(Check(status[i/64],i%64)==0){for(ll j=i*i;j<range;j+=2*i){status[j/64]=Set(status[j/64],j%64);}}}primes.pb(2);for(ll i=3;i<range;i+=2)if(Check(status[i/64],i%64)==0)primes.pb(i);}
     /// _____________________________________________________ ///

#define fyl freopen("input.txt", "r", stdin)
#define Case cout << "Case " << tc << ": "


int main()
{
    fast;


    int n, k;
    cin >> n >> k;

    int a[2*1000+1], vis[2*1000+1];
    F(i, 0,2*1000+1)vis[i]=0;

    F(i, 1, 2*n+1) {cin >> a[i];}

    set<pii, greater<pii>> st2;
    set< pair<int, pair<int, pair<int,int> > > , greater<pair<int, pair<int, pair<int,int> > >>> st1;
    vector<ll>adj(2*1000+1, 0);

    F(i, 0, k){

      ll x, y;
      cin >>x >>y;
      adj[x]=y, adj[y]=x;

      vis[x]=1, vis[y]=1;
      if(a[x] == a[y]){
        ll i1, i2;
        i1 = max(x, y);
        i2 = min(x,y);
        st1.insert({a[x], {a[y], {i1,i2}}});
      }
      else if(a[x]>a[y]){st1.insert({a[x], {a[y], {x,y}}}); }
      else{st1.insert({a[y], {a[x], {y, x}}});}
    }


    F(i, 1, 2*n+1){
      if(vis[i]==0){
        st2.insert({a[i], i});
      }

    }


    ll op;
    cin >> op;

    bool ok = false;


    while(st1.size()>0||st2.size()>0){
         if(op==1){
              if(st1.size() > 0){

                    cout << st1.begin()->ss.ss.ff << endl;

                    ok = true;

              }
              else{
                cout << st2.begin()->ss << endl;

                st2.erase({st2.begin()->ff, st2.begin()->ss});

              }
             op=2;
         }
         else{
            ll in;
            cin >> in;


            if(adj[in]!=0){
                if(ok){
                    ll mx, mn, i1, i2;
                    if(a[in] == a[adj[in]]){
                        mx = a[in];
                        mn = a[adj[in]];
                        i1 = max(in, adj[in]);
                        i2 = min(in, adj[in]);
                    }
                    else if(a[in] > a[adj[in]]){
                        mx = a[in];
                        mn = a[adj[in]];
                        i1 = in;
                        i2 = adj[in];
                    }
                    else{
                        mx = a[ adj[in] ];
                        mn = a[in];
                        i1 = adj[in];
                        i2 = in;
                    }

                    st1.erase({mx, {mn, {i1, i2}}});
                    op = 1;
                    ok = false;

                }
                else{
                    if(st1.size()>0){

                    ll mx, mn, i1, i2;
                    if(a[in] == a[adj[in]]){
                        mx = a[in];
                        mn = a[adj[in]];
                        i1 = max(in, adj[in]);
                        i2 = min(in, adj[in]);
                    }
                    if(a[in] > a[adj[in]]){
                        mx = a[in];
                        mn = a[adj[in]];
                        i1 = in;
                        i2 = adj[in];
                    }
                    else{
                        mx = a[ adj[in] ];
                        mn = a[in];
                        i1 = adj[in];
                        i2 = in;
                    }
                    cout << adj[in] << endl;

                    st1.erase({mx, {mn, {i1, i2}}});
                    //show(st1.size());
                   /// duitai...
                   }
                   else{
                    st2.erase({a[in], in});
                    op = 1;
                   }
                }
            }
            else{
                st2.erase({a[in], in});
                op = 1;

            }


         }
    }


}
Editor is loading...