Untitled
unknown
c_cpp
5 years ago
5.9 kB
5
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...