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 <bits/stdc++.h>
#include "towers.h"
using namespace std;
#define mp make_pair
#define fr first
#define sc second
const long long mm=17,ma=1e9,inf=1e18;
long long n,nn=0,rt,a[100069],sk[100069],sk2[100069],al[100069][2],sbt[100069],dh[100069],an[100069],pr[100069],peu[100069],wg[3][100069],bl[100069][mm];
vector<long long> al2[100069];
pair<long long,long long> as[3][100069];
struct segtree
{
long long l,r,sm;
segtree *p[2];
void bd(long long lh,long long rh)
{
l=lh;
r=rh;
sm=0;
if(l<r)
{
long long ii,md=(l+r)/2;
for(ii=0;ii<2;ii++)
{
p[ii]=new segtree;
p[ii]->bd(!ii?l:md+1,!ii?md:r);
}
}
}
void ud(long long x,long long w)
{
if(l>=x&&r<=x)
{
sm+=w;
}
else
{
long long ii;
segtree *tmp;
for(ii=0;ii<2;ii++)
{
if(!(p[ii]->l>x||p[ii]->r<x))
{
tmp=p[ii];
p[ii]=new segtree;
*p[ii]=*tmp;
p[ii]->ud(x,w);
}
}
sm=p[0]->sm+p[1]->sm;
}
}
long long qr(long long lh,long long rh)
{
if(l>rh||r<lh)
{
return 0;
}
else if(l>=lh&&r<=rh)
{
return sm;
}
else
{
return p[0]->qr(lh,rh)+p[1]->qr(lh,rh);
}
}
}
sg[4][100069];
void bd(long long x)
{
long long i,ii,l,e;
pair<long long,long long> mxe={-inf,-1};
sbt[x]=1;
an[x]=x;
for(ii=0;ii<2;ii++)
{
l=al[x][ii];
if(l)
{
dh[l]=dh[x]+1;
pr[l]=x;
bd(l);
sbt[x]+=sbt[l];
al2[x].push_back(l);
mxe=max(mxe,{sbt[l],al2[x].size()-1});
}
}
e=mxe.sc;
if(e!=-1)
{
swap(al2[x][0],al2[x][e]);
}
bl[x][0]=pr[x];
for(i=1;i<=mm;i++)
{
bl[x][i]=bl[bl[x][i-1]][i-1];
}
}
void bd2(long long x)
{
long long i,sz=al2[x].size(),l;
if(sz)
{
an[al2[x][0]]=an[x];
}
n++;
peu[x]=n;
for(i=0;i<sz;i++)
{
l=al2[x][i];
bd2(l);
}
}
void init(int on,vector<int> aa)
{
long long i,ii,u,k,l;
n=on;
for(i=1;i<=n;i++)
{
a[i]=aa[i-1];
l=-1;
for(;nn&&a[sk[nn]]>a[i];nn--)
{
l=sk[nn];
}
if(l!=-1)
{
al[i][0]=l;
}
if(nn)
{
al[sk[nn]][1]=i;
}
nn++;
sk[nn]=i;
}
rt=sk[1];
bd(rt);
n=0;
bd2(rt);
for(ii=0;ii<2;ii++)
{
u=!ii*2-1;
nn=0;
sk2[0]=ma;
for(i=1+(n-1)*ii;i&&i<=n;i+=u)
{
for(;nn&&a[sk[nn]]>a[i];nn--)
{
sk2[nn-1]=max(sk2[nn-1],sk2[nn]);
}
wg[ii][i]=max(sk2[nn]-a[i],0ll);
nn++;
sk[nn]=i;
sk2[nn]=a[i];
}
}
for(i=1;i<=n;i++)
{
wg[2][i]=min(wg[0][i],wg[1][i]);
}
for(ii=0;ii<3;ii++)
{
for(i=1;i<=n;i++)
{
as[ii][i]={wg[ii][i],i};
}
sort(as[ii]+1,as[ii]+n+1);
sg[ii][0].bd(1,n);
for(i=1;i<=n;i++)
{
k=as[ii][i].sc;
sg[ii][i]=sg[ii][i-1];
sg[ii][i].ud(peu[k],1);
}
}
sg[3][0].bd(1,n);
for(i=1;i<=n;i++)
{
k=as[2][i].sc;
sg[3][i]=sg[3][i-1];
sg[3][i].ud(k,1);
}
}
long long qr2(long long xx,long long lh,long long rh,long long cw)
{
return sg[xx][cw].qr(lh,rh);
}
long long pth(long long x,long long xx,long long lh,long long rh,long long cw,bool kd)
{
long long i,p,z=0;
for(;1;x=pr[an[x]])
{
if(pr[an[x]]<lh||pr[an[x]]>rh)
{
break;
}
z+=sg[xx][cw].qr(peu[an[x]],peu[x]);
}
p=x;
for(i=mm-1;i>=0;i--)
{
if(bl[p][i]>=lh&&bl[p][i]<=rh)
{
p=bl[p][i];
}
}
z+=sg[xx][cw].qr(peu[p]+!kd,peu[x]);
return z;
}
int max_towers(int lb,int rb,int cw)
{
long long ii,p[3],z;
lb++;
rb++;
z=rb-lb+1;
for(ii=0;ii<3;ii++)
{
p[ii]=lower_bound(as[ii]+1,as[ii]+n+1,mp((long long)cw,-inf))-as[ii]-1;
}
z-=qr2(3,lb,rb,p[2]);
z+=pth(lb,2,lb,rb,p[2],1);
z-=pth(lb,1,lb,rb,p[1],0);
z+=pth(rb,2,lb,rb,p[2],0);
z-=pth(rb,0,lb,rb,p[0],0);
return z;
}
Compilation message (stderr)
towers.cpp: In function 'void bd(long long int)':
towers.cpp:106:11: warning: iteration 16 invokes undefined behavior [-Waggressive-loop-optimizations]
106 | bl[x][i]=bl[bl[x][i-1]][i-1];
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
towers.cpp:104:11: note: within this loop
104 | for(i=1;i<=mm;i++)
| ~^~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |