Cod sursa(job #1939058)

Utilizator refugiatBoni Daniel Stefan refugiat Data 25 martie 2017 13:40:29
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream si("gropi.in");
ofstream so("gropi.out");
int s[100005],c,n;
int cont;
struct grup{int x,y;};
grup v[100005];
inline bool comp(grup a,grup b)
{
    return a.y<b.y;
}

int bins(int x,bool k)
{
    int st=1,dr=n,mj;
    //if(k==0)
   // so<<'\n'<<'\n';
    while(st<=dr)
    {
        mj=(st+dr)/2;
       // if(k==0)
        //    so<<mj<<',';
        if(v[mj].y==x)
            return mj;
        if(v[mj].y<x)
            st=mj+1;
        else dr=mj-1;
    }
    //if(k==0)
     //   so<<'\n'<<st<<' '<<dr<<'\n'<<'\n';
    if(k)
        return st;
    return dr;
}
int main()
{
    si>>c>>n;
    for(int i=1;i<=n;++i)
        si>>v[i].x>>v[i].y;
    sort(v+1,v+n+1,comp);
    for(int i=2;i<=n;++i)
        s[i]=s[i-1]+(v[i-1].x!=v[i].x);
    int q;
    si>>q;
    int g1,g2,x1,y1,x2,y2;
    while(q--)
    {
        si>>x1>>y1>>x2>>y2;
        if(y1>y2)
        {
            swap(y1,y2);
            swap(x1,x2);
        }
        g1=bins(y1,1);
        //so<<g1<<' ';
        if(g1>n)
        {
            so<<y2-y1+1+(x2!=x1)<<'\n';
        }
        else
        {
            if(y1==y2)
            {
                so<<1+(x2!=x1)<<'\n';
            }
            else
            {
                if(v[g1].y==y1)
                    ++g1;
                //so<<y2<<' ';
                g2=bins(y2,0);
                //so<<g1<<' '<<g2;
                if(g1>g2)
                {
                    so<<y2-y1+1+(x1!=x2)<<'\n';
                }
                else
                    so<<s[g2]-s[g1]+(v[g2].x==x2)+(v[g1].x==x1)+(y2-y1+1)<<'\n';
            }
        }
    }
    return 0;
}