#include "treasure.h"
#include<bits/stdc++.h>
using namespace std;
const int S = 5e8+1;
std::vector<int> encode(std::vector<std::pair<int, int>> P) {
    int N=(int)P.size();
    vector<int> res,com;
    for(int i=0;i<N;i++){
        res.push_back(P[i].first);
        res.push_back(S+P[i].second);
        com.push_back(P[i].second);
    }
    sort(P.begin(),P.end());
    sort(com.begin(),com.end());
    com.erase(unique(com.begin(),com.end()),com.end());
    int sz=(int)com.size();
    vector<int> bit(sz+1),cnt(N);
    auto query = [&](int x){
        int num=0;
        for(int i=x;i>=1;i-=(i&(-i))) num+=bit[i];
        return num;
    };
    auto update = [&](int x){
        for(int i=x;i<=sz;i+=(i&(-i))) bit[i]++;
    };
    for(int i=N-1;i>=0;i--){
        int pos=lower_bound(com.begin(),com.end(),P[i].second)-com.begin()+1;
        cnt[i]=query(pos);update(pos);
    }
    int C=2*S;
    for(int i=0;i<N;i++){
        res.push_back(C+cnt[i]);
        C+=(N-i);
    }
    return res;
}
std::vector<std::pair<int, int>> decode(std::vector<int> E) {
    int N=(int)E.size()/3;
    vector<int> X,Y,cnt(N);
    for(int x:E){
        if(x<S) X.push_back(x);
        else if(x<2*S) Y.push_back(x-S);
        else{
            x-=2*S;
            int l=0,r=N-1;
            while(l<r){
                int m=(l+r)>>1;
                int total=(N+(N-m))*(m+1)/2;
                if(total<=x) l=m+1;
                else r=m;
            }
            cnt[l]=x-(N-l+1+N)*l/2;
        }
    }
    sort(X.begin(),X.end());
    vector<int> com;
    for(int x:Y) com.push_back(x);
    sort(com.begin(),com.end());
    com.erase(unique(com.begin(),com.end()),com.end());
    int sz=(int)com.size();
    vector<int> bit(sz+1);
    auto update = [&](int x,int val){
        for(int i=x;i<=sz;i+=(i&(-i))) bit[i]+=val;
    };
    for(int i=0;i<N;i++){
        int pos=lower_bound(com.begin(),com.end(),Y[i])-com.begin()+1;
        update(pos,1);
    }
    vector<pair<int,int>> res;
    for(int i=0;i<N;i++){
        int p=0,k=cnt[i]+1;
        for(int i=16;i>=0;i--){
            if(p+(1<<i)<=sz && bit[p+(1<<i)]<k) k-=bit[p+=(1<<i)];
        }
        res.push_back({X[i],com[p]});
        update(p+1,-1);
    }
    return res;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |