| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1295148 | tudor_costin | Bubble Sort 2 (JOI18_bubblesort2) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Nmax=1e6+5,inf=1e9;
struct node
{
ll cnt;
ll maxval;
};
node unite(node st,node dr)
{
node ans;
ans.cnt=st.cnt+dr.cnt;
ans.maxval=max(st.maxval+dr.cnt,dr.maxval);
return ans;
}
ll repr[Nmax];
node aint[4*Nmax];
set<ll> poz[Nmax];
void build(ll nod,ll l,ll r)
{
if(l==r)
{
if(repr[l]==0)
{
aint[nod].cnt=poz[l].size();
aint[nod].maxval=-inf;
}
else
{
aint[nod].cnt=poz[l].size();
aint[nod].maxval=repr[l];
}
return;
}
ll mid=(l+r)/2;
build(2*nod,l,mid);
build(2*nod+1,mid+1,r);
aint[nod]=unite(aint[2*nod],aint[2*nod+1]);
return;
}
void update(ll nod,ll l,ll r,ll x,ll val)
{
if(l==r)
{
if(val==0)
{
aint[nod].cnt=poz[l].size();
aint[nod].maxval=-inf;
}
else
{
aint[nod].cnt=poz[l].size();
aint[nod].maxval=val;
}
return;
}
ll mid=(l+r)/2;
if(x<=mid) update(2*nod,l,mid,x,val);
else update(2*nod+1,mid+1,r,x,val);
aint[nod]=unite(aint[2*nod],aint[2*nod+1]);
return;
}
vector<ll> countScans(vector<ll> a,vector<ll> x,vector<ll> v)
{
ll n=a.size(),q=x.size();
map<ll,vector<pair<ll,ll>>> nrm;
for(ll i=0; i<n; i++) nrm[a[i]].push_back({i,0});
for(ll i=0; i<q; i++) nrm[v[i]].push_back({i,1});
ll nrc=0;
for(auto [val,V]:nrm)
{
nrc++;
for(auto [id,tip]:V)
{
if(tip==0) a[id]=nrc;
else v[id]=nrc;
}
}
for(ll i=0;i<n;i++) poz[a[i]].insert(i+1);
for(ll i=1;i<=nrc;i++)
{
if(!poz[i].empty()) repr[i]=(*poz[i].rbegin());
}
build(1,1,nrc);
vector<ll> ans(q,0);
for(ll i=0;i<q;i++)
{
ll cur=a[x[i]];
poz[cur].erase(poz[cur].find(x[i]+1));
ll nw,prv=repr[cur];
if(poz[cur].empty()) nw=0;
else nw=(*poz[cur].rbegin());
update(1,1,nrc,cur,nw);
repr[cur]=nw;
poz[v[i]].insert(x[i]+1);
nw=(*poz[v[i]].rbegin());
prv=repr[v[i]];
update(1,1,nrc,v[i],nw);
repr[v[i]]=nw;
ans[i]=aint[1].maxval-n;
}
return ans;
}
/*signed main()
{
int n,q;
cin>>n>>q;
vector<int> a(n),x(q),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> ans=countScans(a,x,v);
for(int x:ans) cout<<x<<'\n';
return 0;
}
4 2
1 2 3 4
0 3
2 1
*/
