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 "teams.h"
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define fr first
#define sc second
long long n,nn,fq[500069],inf=1e18;
pair<long long,long long> a[2][500069],sk[200069];
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,segtree *sr)
{
if(l>rh||r<lh)
{
return 0;
}
else if(l>=lh&&r<=rh)
{
return sm-sr->sm;
}
else
{
return p[0]->qr(lh,rh,sr->p[0])+p[1]->qr(lh,rh,sr->p[1]);
}
}
long long bl(long long x,segtree *sr)
{
if(l==r)
{
return l;
}
else
{
long long ii;
for(ii=0;ii<2;ii++)
{
if(x<=p[ii]->sm-sr->p[ii]->sm)
{
return p[ii]->bl(x,sr->p[ii]);
}
x-=p[ii]->sm-sr->p[ii]->sm;
}
return -1;
}
}
}
sg[500069];
void init(int on,int la[],int ra[])
{
long long i,k,l;
n=on;
for(i=1;i<=n;i++)
{
k=la[i-1];
l=ra[i-1];
a[0][i]={k,l};
}
sort(a[0]+1,a[0]+n+1);
for(i=1;i<=n;i++)
{
l=a[0][i].sc;
fq[l]++;
a[1][i]={l,fq[l]};
}
sort(a[1]+1,a[1]+n+1);
for(i=n;i;i--)
{
l=a[0][i].sc;
a[0][i].sc=lower_bound(a[1]+1,a[1]+n+1,mp(l,fq[l]))-a[1];
fq[l]--;
}
sg[0].bd(1,n);
for(i=1;i<=n;i++)
{
l=a[0][i].sc;
sg[i]=sg[i-1];
sg[i].ud(l,1);
}
}
int can(int sz,int qq[])
{
long long i,k,l,w,sm;
sort(qq,qq+sz);
nn=0;
for(i=0;i<sz;i++)
{
sm=qq[i];
k=upper_bound(a[0]+1,a[0]+n+1,mp(sm,inf))-a[0]-1;
l=lower_bound(a[1]+1,a[1]+n+1,mp(sm,0ll))-a[1]-1;
for(;nn;nn--)
{
w=sg[k].qr(l+1,sk[nn].sc-1,&sg[sk[nn].fr]);
if(w>sm)
{
break;
}
l=max(l,sk[nn].sc);
sm-=w;
}
l=sg[k].bl(sg[k].qr(1,l,&sg[sk[nn].fr])+sm,&sg[sk[nn].fr]);
if(l==-1)
{
return 0;
}
nn++;
sk[nn]={k,l};
}
return 1;
}
# | 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... |