Submission #767988

#TimeUsernameProblemLanguageResultExecution timeMemory
767988phoenixBubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
2206 ms75416 KiB
#include<bits/stdc++.h>

using namespace std;

const int inf = 1e9;

const int N = (1 << 20);
int cnt[2 * N];
int add[2 * N];
vector<int> maxf(2 * N, -inf);
int lb[2 * N];
int rb[2 * N];

void build(int v = 1, int l = 0, int r = N - 1) {
    lb[v] = l;
    rb[v] = r;
    if(l == r) {
        return;
    }
    int m = (l + r) / 2;
    build(2 * v, l, m);
    build(2 * v + 1, m + 1, r);
}

void setpush(int v, int x) {
    maxf[v] += x;
    add[v] += x;
}
void push(int v) {
    if(!add[v] || lb[v] == rb[v]) return;
    setpush(2 * v, add[v]);
    setpush(2 * v + 1, add[v]);
    add[v] = 0;
}
void update(int ql, int qr, int x, int v = 1) {
    if(rb[v] < ql || lb[v] > qr) 
        return;
    if(ql <= lb[v] && rb[v] <= qr) {
        setpush(v, x);    
        return;
    }
    push(v);
    update(ql, qr, x, 2 * v);
    update(ql, qr, x, 2 * v + 1);
    cnt[v] = cnt[2 * v] + cnt[2 * v + 1];
    maxf[v] = max(maxf[2 * v], maxf[2 * v + 1]);
}

int get_cnt(int ql, int qr, int v = 1) {
    if(ql > qr || rb[v] < ql || lb[v] > qr) 
        return 0;
    if(ql <= lb[v] && rb[v] <= qr) 
        return cnt[v];
    push(v);
    return get_cnt(ql, qr, 2 * v) + get_cnt(ql, qr, 2 * v + 1);
}
void change(int pos, int x, int y, int v = 1) {
    if(rb[v] < pos || lb[v] > pos) 
        return;
    if(lb[v] == rb[v]) {
        cnt[v] = x;
        maxf[v] = y; 
        return;
    }
    push(v);
    change(pos, x, y, 2 * v);
    change(pos, x, y, 2 * v + 1);
    cnt[v] = cnt[v * 2] + cnt[2 * v + 1];
    maxf[v] = max(maxf[2 * v], maxf[2 * v + 1]);
}
void insert(int pos, int val) {
    change(pos, 1, val - get_cnt(0, pos - 1));
    update(pos + 1, N - 1, -1);
}
void erase(int pos) {
    change(pos, 0, -inf);
    update(pos + 1, N - 1, +1);
}


int find(vector<pair<int, int>> &v, pair<int, int> x) {

    int l = -1, r = (int)v.size();
    while(r - l > 1) {
        int m = (l + r) / 2;
        if(v[m] < x) l = m;
        else r = m;
    }
    if(r == (int)v.size() || v[r] != x) return -1;
    return r;
}

int n, q;
void compress(vector<int> &a, vector<pair<int, int>> &b) {
    int n = (int)a.size();
    vector<pair<int, int>> mp;
    for(int i = 0; i < n; i++) {
        mp.push_back(make_pair(a[i], i));
    }
    for(auto g : b) 
        mp.push_back(g);
    sort(mp.begin(), mp.end());

    int m = (int)mp.size();
    int w[m];
    int k = 0;
    for(int i = 0; i < m; i++) {
        if(i && mp[i] != mp[i - 1]) 
            w[i] = ++k;
        else w[i] = k;
    } 
    for(int i = 0; i < n; i++) {
        a[i] = w[find(mp, make_pair(a[i], i))];
    }
    for(auto &g : b) {
        g.first = w[find(mp, g)];
    }
    mp.clear();
}



vector<int> countScans(vector<int> a, vector<int> X, vector<int> V) {
    build();
    n = (int)a.size();
    q = (int)X.size();
    vector<int> res(q);
    vector<pair<int, int>> updates;
    for(int i = 0; i < q; i++) 
        updates.push_back({V[i], X[i]});
    compress(a, updates);
    for(int i = 0; i < n; i++) {
        insert(a[i], i);
    }
    for(int i = 0; i < q; i++) {
        int pos = updates[i].second, val = updates[i].first;
        erase(a[pos]);
        insert(val, pos);
        // if(a[pos] < val) update(a[pos] + 1, val, +1);
        // else update(val + 1, a[pos], -1);
        a[pos] = val;
        
        res[i] = maxf[1];
    }
    return res;
}

    

// int main() {
//     ios::sync_with_stdio(0);
//     cin.tie(0);cout.tie(0);
//     int n, q;
//     cin >> n >> q;
//     vector<int> A(n);
//     vector<int> X(q);
//     vector<int> V(q);
//     for(int i = 0; i < n; i++) {
//         cin >> A[i];
//     }
//     for(int i = 0; i < q; i++) {
//         cin >> X[i] >> V[i];
//     }
//     vector<int> res = countScans(A, X, V);
//     for(int c : res) 
//         cout << c << '\n'; 
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...