Untitled
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...