Submission #1156639

#TimeUsernameProblemLanguageResultExecution timeMemory
1156639njoopBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
3620 ms104204 KiB
//#include "bubblesort2.h"
#include <bits/stdc++.h>

using namespace std;

map<pair<int, int>, int> mp;
const int inf = 1e9+7;

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 -inf;
        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(), idx, oidx;
	vector<int> answer(q);
    vector<pair<int, int>> vec;
    st seg;
    seg.init();
    for(int i=0; i<n; i++) {
        vec.push_back({a[i], i});
    }
    for(int i=0; i<q; i++) {
        vec.push_back({v[i], x[i]});
    }
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), 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], i}];
        seg.update(1, n+q, idx, idx, i+1, 1);
        seg.update(1, n+q, idx, n+q, -1, 1);
    }
    for(int i=0; i<q; i++) {
        idx = mp[{v[i], x[i]}];
        oidx = mp[{a[x[i]], x[i]}];
        seg.update(1, n+q, oidx, oidx, -x[i]-1, 1);
        seg.update(1, n+q, oidx, n+q, 1, 1);
        seg.update(1, n+q, idx, idx, x[i]+1, 1);
        seg.update(1, n+q, idx, n+q, -1, 1);
        a[x[i]] = v[i];
        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...