Submission #1156597

#TimeUsernameProblemLanguageResultExecution timeMemory
1156597njoopBubble Sort 2 (JOI18_bubblesort2)C++20
0 / 100
27 ms21572 KiB
//#include "bubblesort2.h"
#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 ordered_set tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update>

ordered_set s;
map<int, int> mp;

struct st {
    vector<int> seg, lazy;

    void init() {
        seg.assign(2500010, 0);
        lazy.assign(2500010, 0);
    }

    void push(int l, int r, int node) {
        if(lazy[node] != 0) {
            seg[node] += lazy[node];
            if(l != r) {
                lazy[node*2] += lazy[node];
                lazy[node*2+1] += lazy[node];
            }
            lazy[node] = 0;
        }
    }

    void update(int l, int r, int idl, int idr, int val, int node) {
        push(l, r, node);
        if(l > idr || r < idl) return;
        if(l >= idl && r <= idr) {
            seg[node] += val;
            if(l != r) {
                lazy[node*2] += val;
                lazy[node*2+1] += val;
            }
            return;
        }
        int mid = l + (r-l)/2;
        update(l, mid, idl, idr, val, node*2);
        update(mid+1, r, idl, idr, val, node*2+1);
        seg[node] = max(seg[node*2], seg[node*2+1]);
    }

    int query(int l, int r, int ql, int qr, int node) {
        push(l, r, node);
        if(l > qr || r < ql) return 0;
        if(l >= ql && r <= qr) return seg[node];
        int mid = l+(r-l)/2;
        return max(query(l, mid, ql, qr, node*2), query(mid+1, r, ql, qr, node*2+1));
    }
};

vector<int> countScans(vector<int> a, vector<int> x, vector<int> v){
	int q=x.size(), n=a.size(), val, idx, oidx;
	vector<int> answer(q), vec;
    st seg;
    seg.init();
    for(int i=0; i<n; i++) {
        vec.push_back(a[i]);
        s.insert(a[i]);
    }
    for(int i=0; i<q; i++) {
        vec.push_back(v[i]);
    }
    sort(vec.begin(), vec.end());
    unique(vec.begin(), vec.end());
    for(int i=0; i<vec.size(); i++) {
        mp[vec[i]] = i+1;
    }
    for(int i=0; i<n; i++) {
        idx = mp[a[i]];
        val = i-s.order_of_key(a[i]);
        seg.update(1, n+q, idx, idx, val, 1);
    }
    for(int i=0; i<q; i++) {
        idx = mp[v[i]];
        oidx = mp[a[x[i]]];
        s.erase(s.find(a[x[i]]));
        s.insert(v[i]);
        a[x[i]] = v[i];
        if(oidx < idx) {
            seg.update(1, n+q, oidx, idx, 1, 1);
        } else {
            seg.update(1, n+q, idx, oidx, -1, 1);
        }
        val = seg.query(1, n+q, oidx, oidx, 1);
        seg.update(1, n+q, oidx, oidx, -val, 1);
        val = x[i]-s.order_of_key(v[i]) - seg.query(1, n+q, idx, idx, 1);
        seg.update(1, n+q, idx, idx, val, 1);
        answer[i] = seg.query(1, n+q, 1, n+q, 1);
    }
	return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...