제출 #1288008

#제출 시각아이디문제언어결과실행 시간메모리
1288008simona1230Examination (JOI19_examination)C++20
0 / 100
2193 ms23088 KiB
#include <bits/stdc++.h>

using namespace std;
long long n,q;
struct student
{
    long long x,y,z,i;
    student() {}
    student(long long _x,long long _y,long long _z,long long _i)
    {
        x=_x;
        y=_y;
        z=_z;
        i=_i;
    }

    bool operator<(const student&s)const
    {
        if(z==s.z)
        {
            if(x==s.x)
            {
                if(y==s.y)
                {
                    return s.i!=-1;
                }

                return y>s.y;
            }

            return x>s.x;
        }
        return z>s.z;
    }
};

bool cmpa(student s1,student s2)
{
        if(s1.x==s2.x)
        {
            return s1.y>s2.y;
        }

        return s1.x>s2.x;
}

long long ans[200001];
student a[200001];
long long t[800001];
void upd(long long i,long long l,long long r,long long id,long long x)
{
    if(l==r)
    {
        t[i]+=x;
        return;
    }

    long long m=(l+r)/2;
    if(id<=m)upd(i*2,l,m,id,x);
    else upd(i*2+1,m+1,r,id,x);

    t[i]=t[i*2]+t[i*2+1];
}

long long query(long long i,long long l,long long r,long long id)
{
    if(l==r)return t[i];
    long long m=(l+r)/2;
    if(m<id)return query(i*2+1,m+1,r,id);
    return query(i*2,l,m,id)+t[i*2+1];
}

long long cnt=1;

void solve(long long l,long long r)
{
    if(l==r)return;

    long long m=(l+r)/2;
    solve(l,m);
    solve(m+1,r);

    vector<student> v1,v2;
    //cout<<l<<" ! "<<r<<endl;

    for(long long i=l; i<=m; i++)
    {
        v1.push_back(a[i]);
    }

    for(long long i=m+1; i<=r; i++)
    {
        v2.push_back(a[i]);
    }

    sort(v1.begin(),v1.end(),cmpa);
    sort(v2.begin(),v2.end(),cmpa);

    long long j=0;
    for(long long i=0; i<v2.size(); i++)
    {
        if(v2[i].i==-1)continue;
        while(j<v1.size()&&v1[j].x>=v2[i].x)
        {
            if(v1[j].i==-1)
            {
                //cout<<" + "<<v1[j].y<<endl;
                upd(1,1,cnt,v1[j].y,1);
            }
            j++;
        }

        //cout<<" = "<<v2[i].i<<" "<<query(1,1,cnt,v2[i].y)<<endl;
        ans[v2[i].i]+=query(1,1,cnt,v2[i].y);
    }

    for(long long i=0; i<j; i++)
        if(v1[i].i==-1)
            upd(1,1,cnt,v1[i].y,-1);
}


bool cmp(student s1,student s2)
{
    return s1.y<s2.y;
}

void read()
{
    cin>>n>>q;
    for(long long i=1; i<=n; i++)
    {
        long long x,y;
        cin>>x>>y;
        a[i]= {x,y,x+y,-1};
    }

    for(long long i=1; i<=q; i++)
    {
        long long x,y,z;
        cin>>x>>y>>z;
        a[i+n]= {x,y,z,i};
    }

    sort(a+1,a+n+q+1,cmp);

    for(long long i=1; i<=n+q; i++)
    {
        long long add=0;
        if(i!=n+q&&a[i].y!=a[i+1].y)add++;
        a[i].y=cnt;
        cnt+=add;
    }

    sort(a+1,a+n+q+1);

    /*cout<<endl;
    for(long long i=1;i<=n+q;i++)
        cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].z<<" "<<a[i].i<<endl;
    cout<<endl;*/
}


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    read();
    solve(1,n+q);
    for(long long i=1; i<=q; i++)
        cout<<ans[i]<<endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...