#include <bits/stdc++.h>
#include "shoes.h"
 
using namespace std;
#define pb push_back
#define ll long long
const ll inf=1e9+4;
const ll off=(1<<19);
ll tr[off*2];
ll op(ll trl,ll trr){
    return trl+trr;
}
void upd(ll i,ll v){
    i+=off;
    tr[i]=v;
    while (i/=2){
        ll xl=i*2,xr=xl+1;
        tr[i]=op(tr[xl],tr[xr]);
    }
}
ll query(ll ql,ll qr,ll l=0,ll r=off-1,ll x=1){
    if (ql<=l && r<=qr)return tr[x];
    if (l>qr || r<ql)return 0;
    ll mid=(l+r)/2;
    ll xl=x*2,xr=xl+1;
    ll trl=query(ql,qr,l,mid,xl),trr=query(ql,qr,mid+1,r,xr);
    return op(trl,trr);
}
ll count_swaps(vector<int>a){
    ll n=a.size();
    ll us[n+1];
    for (int i=0;i<n;i++){
        upd(i,1);
        us[i]=1;
    }
    vector<ll>adp[n+1];
    vector<ll>adn[n+1];
    vector<ll>p(n+1);
    //cout<<"DSFI";
    for (int i=0;i<n;i++){
        if (a[i]>0){
            if (adn[abs(a[i])].size()){
                p[i]=(adn[abs(a[i])].back());
                p[adn[abs(a[i])].back()]=(i);
                adn[abs(a[i])].pop_back();
            }else{
                adp[a[i]].pb(i);
            }
        }
        else{
            //cout<<'d';
            if (adp[abs(a[i])].size()){
                p[i]=(adp[abs(a[i])].back());
                p[adp[abs(a[i])].back()]=(i);
                adp[abs(a[i])].pop_back();
            }else{
                //cout<<i<<endl;
                adn[abs(a[i])].pb(i);
            }
        }
    }
    // for (int i=0;i<n;i++){
    //     cout<<p[i]<<" ";
    // }cout<<endl;
    ll sum=0;
    for (int i=n-1;i>=0;i--){
        if (!us[i])continue;
        // for (auto x:us){
        //     cout<<x<<" ";
        // }cout<<endl;
        ll r=i-1,l=p[i]+1;
        //cout<<l<<" "<<r<<endl;
        if (l<=r){
            ll x=query(l,r);
            sum+=x;
            //cout<<x<<endl;
        }
        upd(i,0);
        upd(p[i],0);
        us[i]=0,us[p[i]]=0;
        if (a[i]<0 && a[p[i]]>0)sum++;
        //cout<<sum<<" ";
    }
    return sum;
}
// int main() {
// 	int n;
// 	assert(1 == scanf("%d", &n));
// 	vector<int> S(2 * n);
// 	for (int i = 0; i < 2 * n; i++)
// 		assert(1 == scanf("%d", &S[i]));
// 	fclose(stdin);
// 	long long result = count_swaps(S);
// 	printf("%lld\n", result);
// 	fclose(stdout);
// 	return 0;
// }
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |