Cod sursa(job #2759847)

Utilizator stefantagaTaga Stefan stefantaga Data 20 iunie 2021 22:01:26
Problema Gropi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("gropi.in");
ofstream g("gropi.out");
struct wow
{
    long long  x,y;
}v[100005];
bool compare (wow a,wow b)
{
    return a.y<b.y;
}
long long  distanta (pair <long long ,long long > a ,pair <long long ,long long > b)
{
    return abs(a.first-b.first)+abs(a.second-b.second)+1;
}
long long  col,n,i,sum[100005],x,y,x2,y2,st,dr,mij,sol,sol1,m;
int main()
{
    f>>col>>n;
    for (i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
    }
    sort (v+1,v+n+1,compare);
    for (i=2;i<=n;i++)
    {
        sum[i]=sum[i-1]+distanta({v[i-1].x%2+1,v[i-1].y},{v[i].x%2+1,v[i].y});
    }
    f>>m;
    for (i=1;i<=m;i++)
    {
        f>>x>>y>>x2>>y2;
        if (y2<y)
        {
            swap(x,x2);
            swap(y,y2);
        }
        st=1;
        dr=n;
        sol=0;
        while (st<=dr)
        {
            mij=(st+dr)/2;
            if (y<v[mij].y)
            {
                sol=mij;
                dr=mij-1;
            }
            else
            {
                st=mij+1;
            }
        }
        if (sol==0)
        {
            g<<distanta({x,y},{x2,y2})<<'\n';
        }
        else
        {
            st=1;
            dr=n;
            sol1=0;
            while (st<=dr)
            {
                mij=(st+dr)/2;
                if (v[mij].y<y2)
                {
                    sol1=mij;
                    st=mij+1;
                }
                else
                {
                    dr=mij-1;
                }
            }
            if (sol1==0)
            {
                g<<distanta({x,y},{x2,y2})<<'\n';
            }
            else
            {
                g<<distanta({x,y},{v[sol].x%2+1,v[sol].y})+sum[sol1]-sum[sol]+distanta({v[sol1].x%2+1,v[sol1].y},{x2,y2})-(sol1-sol+1)<<'\n';
            }
        }
    }
    return 0;
}