#include <bits/stdc++.h>
#include "teams.h"
using namespace std;
struct cell
{
    int l,r;
};
struct seg
{
    int l,r,st;
};
struct pro
{
    int pos,st;
};
bool cmp(cell a1,cell a2)
{
    return a1.l<a2.l;
}
cell c[500005];
seg p[5000005];
pro a[500005];
int n,m,d[500005],num,dp[500005];
int br;
void check(int h)
{
    if(!p[h].l)
    {
        p[h].l=br;
        br++;
        p[h].r=br;
        br++;
    }
}
void build(int l,int r,int h)
{
    if(l==r)return;
    int mid=(l+r)/2;
    check(h);
    build(l,mid,p[h].l);
    build(mid+1,r,p[h].r);
}
void calc(int h)
{
    p[h].st=p[p[h].l].st+p[p[h].r].st;
}
void update(int l,int r,int q,int h)
{
    if(l==r)
    {
        p[h].st++;
        return;
    }
    int mid=(l+r)/2;
    if(mid>=q)
    {
        if(!p[h].l)
        {
            p[h].l=br;
            br++;
        }
        update(l,mid,q,p[h].l);
    }
    else
    {
        if(!p[h].r)
        {
            p[h].r=br;
            br++;
        }
        update(mid+1,r,q,p[h].r);
    }
    calc(h);
}
void fil(int l,int r,int h,int last)
{
    if(l==r)return;
    int mid=(l+r)/2;
    if(!p[h].l)p[h].l=p[last].l;
    else fil(l,mid,p[h].l,p[last].l);
    if(!p[h].r)p[h].r=p[last].r;
    else fil(mid+1,r,p[h].r,p[last].r);
    calc(h);
}
int query(int l,int r,int ql,int qr,int h)
{
    if(l>qr||r<ql)return 0;
    if(l>=ql&&r<=qr)return p[h].st;
    int mid=(l+r)/2;
    return query(l,mid,ql,qr,p[h].l)+query(mid+1,r,ql,qr,p[h].r);
}
void print(int l,int r,int h)
{
    cout<<l<<" "<<r<<" "<<p[h].st<<" "<<p[h].l<<" "<<p[h].r<<" "<<h<<endl;
    if(l==r)return;
    int mid=(l+r)/2;
    print(l,mid,p[h].l);
    print(mid+1,r,p[h].r);
}
void init(int N,int a[],int b[])
{
    n=N;
    br=n+1;
    for(int i=1;i<=n;i++)
    {
        c[i].l=a[i-1];
        c[i].r=b[i-1];
    }
    sort(c+1,c+n+1,cmp);
    build(1,n,1);
    int to=1;
    for(int i=1;i<=n;i++)
    {
        while(c[to].l==i)
        {
            //update(1,n,c[to].r,i);
            to++;
        }
        if(i!=1)fil(1,n,i,i-1);
    }
    return;
}
bool check()
{
    int nn=0;
    for(int i=1;i<=m;i++)
    {
        nn+=d[i];
    }
    if(nn>n)return false;
    return true;
}
void merg()
{
    sort(d+1,d+m+1);
    for(int i=1;i<=m;i++)
    {
        if(a[num].pos!=d[i])
        {
            num++;
            a[num].pos=d[i];
            a[num].st+=d[i];
        }
        else
        {
            a[num].st+=d[i];
        }
    }
}
bool make_dp()
{
    for(int i=1;i<=num;i++)
    {
        dp[i]=1e9;
        for(int j=0;j<i;j++)
        {
            dp[i]=min(dp[i],dp[j]+query(1,n,a[i].pos,n,a[i].pos)-query(1,n,a[i].pos,n,a[j].pos)-a[i].st);
        }
        //cout<<a[i].st<<" "<<query(1,n,i,n,i)<<" "<<query(1,n,i,n,0)<<endl;
        //cout<<dp[i]<<endl;
        if(dp[i]<0)return false;
    }
    return true;
}
void clea()
{
    for(int i=1;i<=m;i++)
    {
        d[i]=0;
        dp[i]=0;
        a[i].pos=0;
        a[i].st=0;
    }
    num=0;
}
int can(int M,int D[])
{
    m=M;
    clea();
    for(int i=m;i>=1;i--)
    {
        d[i]=D[i-1];
    }
    d[0]=0;
    if(!check())return false;
    merg();
    return make_dp();
}
| # | 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... |