Submission #1109763

#TimeUsernameProblemLanguageResultExecution timeMemory
1109763VinhLuuBubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
1631 ms87280 KiB
#include <bits/stdc++.h> #define ll long long #include "bubblesort2.h" using namespace std; const int N = 1e6 + 5; const int oo = -1e9; int n, m, q, a[N], _x[N], _y[N], kq[N], pos[N]; int st[N << 2], lz[N << 2], le[N], ri[N]; void build(int i,int l,int r){ if(l == r){ st[i] = oo; return; } int mid = (l + r) / 2; build(i << 1, l, mid); build(i << 1|1, mid + 1, r); st[i] = max(st[i << 1], st[i << 1|1]); } void dolz(int i){ if(!lz[i]) return; int x = lz[i]; lz[i] = 0; lz[i << 1] += x; lz[i << 1|1] += x; st[i << 1] += x; st[i << 1|1] += x; } void update(int i,int l,int r,int u,int v,int x){ if(l > r || r < u || v < l) return; if(u <= l && r <= v){ st[i] += x; lz[i] += x; return; } dolz(i); int mid = (l + r) / 2; update(i << 1, l, mid, u, v, x); update(i << 1|1, mid + 1, r, u, v, x); st[i] = max(st[i << 1], st[i << 1|1]); } void change(int i,int l,int r,int u,int val){ if(l > r || r < u || u < l) return; if(l == r){ st[i] = val; lz[i] = 0; return; } dolz(i); int mid = (l + r) / 2; change(i << 1, l, mid, u, val); change(i << 1|1, mid + 1, r, u, val); st[i] = max(st[i << 1], st[i << 1|1]); } int b[N], T[N]; void inc(int x,int val){ for(int i = x; i <= m; i += i & (-i)) T[i] += val; } int query(int x){ int ret = 0; for(int i = x; i; i -= i & (-i)) ret += T[i]; return ret; } int c[N]; std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){ n = A.size(); for(int i = 0; i < n; i ++){ a[i + 1] = A[i]; c[++m] = i + 1; } q = X.size(); for(int k = 0; k < q; k ++){ _x[k + 1] = X[k] + 1, _y[k + 1] = V[k]; c[++m] = n + k + 1; a[n + k + 1] = _y[k + 1]; } sort(c + 1, c + m + 1, [&](int x,int y){return a[x] < a[y];}); int last = 1; for(int i = 1; i <= m; i ++){ if(a[c[i]] != a[c[i - 1]]) last = i; le[i] = last; pos[c[i]] = i; } last = m; for(int i = m; i >= 1; i --){ if(a[c[i]] != a[c[i + 1]]) last = i; ri[i] = last; } // for(int i = 1; i <= m; i ++) cerr << i << " " << pos[i] << " " << le[pos[i]] << " " << ri[pos[i]] << " k\n"; build(1, 1, m); for(int i = 1; i <= n; i ++){ change(1, 1, m, pos[i], i); inc(pos[i], 1); } for(int i = 1; i <= n; i ++){ update(1, 1, m, le[pos[i]], m, -1); b[i] = i; } for(int k = 1; k <= q; k ++){ int x = _x[k]; int y = _y[k]; int tmp = pos[n + k]; update(1, 1, m, le[pos[b[x]]], m, +1); change(1, 1, m, pos[b[x]], oo); inc(pos[b[x]], -1); inc(tmp, 1); update(1, 1, m, le[tmp], m, -1); change(1, 1, m, tmp, x - query(ri[tmp])); b[x] = n + k; kq[k] = st[1]; } std::vector<int> answer(q); for(int j = 0; j < q; j ++) { answer[j] = kq[j + 1]; } return answer; } //#define LOCAL #ifdef LOCAL int _n, _q; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "v" if(fopen(task ".inp","r")){ freopen(task ".inp","r",stdin); freopen(task ".out","w",stdout); } cin >> _n >> _q; std::vector<int> A(_n); for(int i = 0; i < _n; i ++) cin >> A[i]; std::vector<int> X(_q),V(_q); for(int j = 0; j < _q ; j++){ cin >> X[j] >> V[j]; } std::vector<int> res=countScans(A,X,V); for(int j=0;j<int(res.size());j++) cout << res[j] << "\n"; } /* 4 2 1 2 3 4 0 3 2 1 */ #endif // LOCAL

Compilation message (stderr)

bubblesort2.cpp: In function 'std::vector<int> countScans(std::vector<int>, std::vector<int>, std::vector<int>)':
bubblesort2.cpp:119:9: warning: unused variable 'y' [-Wunused-variable]
  119 |     int y = _y[k];
      |         ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...