Cod sursa(job #2759835)

Utilizator stefantagaTaga Stefan stefantaga Data 20 iunie 2021 21:33:39
Problema Gropi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("gropi.in");
ofstream g("gropi.out");
struct wow
{
    int x,y;
}v[100005];
bool compare (wow a,wow b)
{
    return a.y<b.y;
}
int distanta (pair <int,int> a ,pair <int,int> b)
{
    return abs(a.first-b.first)+abs(a.second-b.second);
}
int 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;
        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})+1<<'\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})+1<<'\n';
            }
            else
            {
                g<<distanta({x,y},{v[sol].x%2+1,v[sol].y})+sum[sol1]-sum[sol-1]+distanta({v[sol1].x%2+1,v[sol1].y},{x2,y2})+1<<'\n';
            }
        }
    }
    return 0;
}