This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bubblesort2.h"
#include <bits/stdc++.h>
using namespace std;
// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e9
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
#define sz size()
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const int H=20;
const int N=(1<<H);
vi A, X, V;
vi dif;
int seg[N*2], laz[N];
void apply(int p, int v) {
seg[p] += v;
if(p < N) laz[p] += v;
}
void build(int p) {
while(p>1) p/=2, seg[p]=max(seg[p*2],seg[p*2+1])+laz[p];
}
void push(int p) {
REV(s,1,H+1) {
int i=p>>s;
apply(i*2 ,laz[i]);
apply(i*2+1,laz[i]);
laz[i] = 0;
}
}
void add(int l, int r, int v) {
int l0=l+=N, r0=r+=N;
for(; l<r; l/=2, r/=2) {
if(l&1) apply(l++,v);
if(r&1) apply(--r,v);
}
build(l0);
build(r0-1);
}
int get(int l, int r) {
l+=N; r+=N;
push(l);
push(r-1);
int res=0;
for(; l<r; l/=2, r/=2) {
if(l&1) res += seg[l++];
if(r&1) res += seg[--r];
}
return res;
}
map<int,set<int>> mp;
void update(int i, int v) {
add(A[i],N,-v);
if(v == 1) {
if(!mp[A[i]].empty())
add(A[i],A[i]+1,-*prev(mp[A[i]].end()));
mp[A[i]].insert(i);
add(A[i],A[i]+1, *prev(mp[A[i]].end()));
} else {
add(A[i],A[i]+1,-*prev(mp[A[i]].end()));
mp[A[i]].erase(i);
if(!mp[A[i]].empty())
add(A[i],A[i]+1, *prev(mp[A[i]].end()));
}
}
vi countScans(vi _A, vi _X, vi _V){
A=_A; X=_X; V=_V;
int n=A.size();
int q=X.size();
vi ans(q);
RE(i,n) dif.pb(A[i]);
RE(i,q) dif.pb(V[i]);
sort(all(dif));
dif.erase(unique(all(dif)), dif.end());
RE(i,n) A[i] = lower_bound(all(dif), A[i])-dif.begin();
RE(i,q) V[i] = lower_bound(all(dif), V[i])-dif.begin();
add(0,N,1);
RE(i,n) update(i,1);
RE(j,q) {
update(X[j],-1);
A[X[j]] = V[j];
update(X[j], 1);
ans[j] = get(0,N);
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |