Cod sursa(job #933258)

Utilizator misinozzz zzz misino Data 29 martie 2013 19:09:18
Problema Gropi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("gropi.in");
ofstream g("gropi.out");
int i,n,m,c,p1,p2,s[100010];
struct pc{int x,y;};
pc v[100010],a,b;
bool cmp(pc a,pc b)
{
    if(a.x==b.x)
    return a.y<b.y;
    return a.x<b.x;
}
int bs(int x)
{
    int li=1,ls=n,mij;
    while(li<ls)
    {
        mij=(li+ls)>>1;
        if(v[mij].x<x)
        li=mij+1;
        else
        ls=mij;
    }
    return li;
}
int bs2(int x)
{
    int li=1,ls=n,mij;
    while(li<ls)
    {
        mij=(li+ls+1)>>1;
        if(v[mij].x<x)
        li=mij;
        else
        ls=mij-1;
    }
    return li;
}
int main()
{
    f>>c>>n;
    for(i=1;i<=n;++i)
    {
        f>>v[i].y>>v[i].x;
    }
    ++n;
    v[n].x=0;
    v[n].y=0;
    ++n;
    v[n].x=c+1;
    v[n].y=0;
    sort(v+1,v+n+1,cmp);
    s[1]=(v[1].y!=v[2].y);
    for(i=2;i<n;++i)
    s[i]=s[i-1]+(v[i].y!=v[i+1].y);
    f>>m;
    for(;m;--m)
    {
        f>>a.y>>a.x>>b.y>>b.x;
        if(a.x>b.x||a.x==b.x&&a.y>b.y)
        swap(a,b);
        p1=bs(a.x);
        if(v[p1].x>=b.x)
        g<<b.x-a.x+1+(a.y!=b.y)+1<<'\n';
        else
        {
            p2=bs2(b.x);
            g<<s[p2-1]-s[p1-1]+b.x-a.x+(a.y==v[p1].y)+(b.y==v[p2].y)+1<<'\n';
        }
    }
    return 0;
}