Cod sursa(job #1747203)

Utilizator akaprosAna Kapros akapros Data 24 august 2016 16:46:40
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
#define pii pair < int, int >
#define mp make_pair
#define x first
#define y second
#define maxN 100002
using namespace std;
int n, m, k, ans, ps[maxN];
pii v[maxN];
int bs(pii a)
{
    int i = 0, p = 1 << 16;
    while (p)
    {
        if (i + p <= n && v[i + p] < a)
            i += p;
        p >>= 1;
    }
    return i + 1;
}
void read()
{
    int i;
    freopen("gropi.in", "r", stdin);
    scanf("%d %d", &k, &n);
    for (i = 1; i <= n; ++ i)
        scanf("%d %d", &v[i].y, &v[i].x);
}
void solve()
{
    int i;
    v[++ n] = mp(0, 0);
    v[++ n] = mp(k + 1, 0);
    sort(v + 1, v + n + 1);
    for (i = 1; i <= n; ++ i)
        ps[i] = ps[i - 1] + (v[i].y != v[i + 1].y);
}
void write()
{
    freopen("gropi.out", "w", stdout);
    scanf("%d", &m);
    while (m --)
    {
        pii a, b;
        scanf("%d %d %d %d\n", &a.y, &a.x, &b.y, &b.x);
        if (a > b)
            swap(a, b);
        int x = bs(mp(a.x, 0)), y = bs(mp(b.x, 0)) - 1;
        //printf("%d %d\n", x, y);
        if (v[x].x >= b.x)
            ans = b.x - a.x + 1 + (b.y != a.y);
        else
        {
            ans = b.x - a.x + 1 + ps[y - 1] - ps[x - 1];
            ans += (a.y == v[x].y) + (b.y == v[y].y);
        }
        printf("%d\n", ans);
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}