Submission #78387

#TimeUsernameProblemLanguageResultExecution timeMemory
78387igziZalmoxis (BOI18_zalmoxis)C++17
0 / 100
1080 ms70200 KiB
#include <bits/stdc++.h>
#include <ext/rope>
#define maxN 1000005
#define s 4294967296

using namespace std;
using namespace __gnu_cxx;

int n,k,i,x,p;
priority_queue <pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
int f[maxN];
void update(int p){
while(p<=n){
    f[p]++;
    p+=p & (-p);
}
}
int query(int p){
int ans=0;
while(p>0){
    ans+=f[p];
    p-=p &(-p);
}
return ans;
}
struct broj{
int b;
int sl;
};
broj v[maxN];
rope <long long> r;

int main()
{
    std::ios::sync_with_stdio(false);
    cin>>n>>k;
    cin>>x;
    pq.push({x,i});
    p=0;
    r.insert(r.mutable_end(),s*x+p);
    v[0].b=x;
    v[0].sl=-1;
    p=1;
    for(i=1;i<n;i++){
        cin>>x;
        pq.push({x,i});
        v[p].b=x;
        v[p-1].sl=p;
        r.insert(r.mutable_end(),s*x+p);
        p++;
    }
    v[p-1].sl=-1;
    //for(i=0;i<n;i++) cout<<r[i]/s<<" ";
    while(k>0){
        long long tmp=pq.top().second;
        pq.pop();
        x=tmp-query(tmp);
        if((x==r.size()-1 || r[x+1]/s!=r[x]/s) && (x==0 || r[x-1]/s!=r[x]/s)){
            broj c;
            c.sl=v[r[x]%s].sl;
            c.b=r[x]/s;
            pq.push({c.b,tmp});
            v[p]=c;
            v[r[x]%s].sl=p;
            tmp=(r[x]/s+1)*s+p;
            p++;
            //cout<<r[x]/s<<" "<<tmp/s<<endl;
            r.erase(x,1);
            r.insert(r.mutable_begin()+x,tmp);
        }
        else{
            if(x!=r.size()-1 && r[x+1]/s==r[x]/s){
                update(r[x+1]%s);
                broj c;
                c.sl=v[r[x+1]%s].sl;
                c.b=r[x+1]/s+1;
                pq.push({c.b,tmp});
                v[p]=c;
                v[r[x+1]%s].sl=p;
                tmp=(r[x]/s+1)*s+p;
                p++;
                r.erase(x,1);
                r.insert(r.mutable_begin()+x,tmp);
                r.erase(x+1,1);
            }
            else{
                update(r[x-1]%s);
                broj c;
                c.sl=v[r[x-1]%s].sl;
                c.b=r[x-1]/s+1;
                pq.push({c.b,tmp});
                v[p]=c;
                v[r[x-1]%s].sl=p;
                tmp=(r[x]/s+1)*s+p;
                p++;
                r.erase(x,1);
                r.insert(r.mutable_begin()+x,tmp);
                r.erase(x-1,1);
            }
        }
        k--;
    }
    int x=0;
    while(x!=-1){
        cout<<v[x].b<<" ";
        x=v[x].sl;
    }
    return 0;
}

Compilation message (stderr)

zalmoxis.cpp: In function 'int main()':
zalmoxis.cpp:58:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if((x==r.size()-1 || r[x+1]/s!=r[x]/s) && (x==0 || r[x-1]/s!=r[x]/s)){
             ~^~~~~~~~~~~~
zalmoxis.cpp:72:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(x!=r.size()-1 && r[x+1]/s==r[x]/s){
                ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...