Cod sursa(job #197354)

Utilizator filipbFilip Cristian Buruiana filipb Data 3 iulie 2008 20:27:44
Problema Gropi Scor Ascuns
Compilator cpp Status done
Runda Marime 2.08 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define PII pair<int, int>
#define x first
#define y second
typedef struct { int lin, start, finish; } entry;

int C, N, M;
PII v[100005];
entry E[100005]; int ev;

inline void swap(int &a, int &b)
{
    int aux = a;
    a = b;
    b = aux;
}

inline int BF(int y, int from)
{
    int l, r, m, last = 0;

    for (l = from, r = ev; l <= r; )
    {
        m = (l + r) / 2;
        if (E[m].start > y) r = m-1;
        else last = m, l = m+1;
    }
    return last;
}

inline int between(int y1, int y2)
{
    int l, r, m;

    for (l = 1, r = N; l <= r; )
    {
        m = (l + r) / 2;
        if (v[m].x < y1) l = m+1;
        else if (v[m].x > y2) r = m-1;
        else return 1;
    }
    return 0;
}

int main(void)
{
    int i, x1, y1, x2, y2;
    int i1, i2;
    
    freopen("gropi.in", "r", stdin);
    freopen("gropi.out", "w", stdout);

    scanf("%d %d", &C, &N);
    for (i = 1; i <= N; ++i)
        scanf("%d %d", &v[i].y, &v[i].x);

    sort(v+1, v+N+1);
    E[ev=1].lin = v[1].y; E[1].start = E[1].finish = v[1].x;
    for (i = 2; i <= N; ++i)
        if (E[ev].lin == v[i].y)
            E[ev].finish = v[i].x;
        else
            ++ev, E[ev].start = E[ev].finish = v[i].x, E[ev].lin = v[i].y;
    E[0].start = E[0].finish = 0; E[0].lin = 3 - E[1].lin;

    scanf("%d", &M);
    for (; M; --M)
    {
        scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
        if (y1 > y2)
            swap(x1, x2),
            swap(y1, y2);

        i1 = BF(y1, 1);
        i2 = BF(y2, i1);

        if (i1 < i2)
        {
            if (y1 < E[i1].finish)
                printf("%d\n", y2-y1+1 + (E[i1].lin==x1) + (E[i2].lin==x2) + i2-i1);
            else
                printf("%d\n", y2-y1+1 + (E[i2].lin==x2) + i2-i1-(E[i1].lin==x1));
        }
        else
        {
            if (x1 != x2)
                printf("%d\n", y2-y1+2);
            else
                printf("%d\n", y2-y1+1 + 2 * between(y1, y2));
        }
    }
            
    return 0;
}