Cod sursa(job #1988768)

Utilizator mariusn01Marius Nicoli mariusn01 Data 4 iunie 2017 17:56:25
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 kb
#include <fstream>
#include <algorithm>
#define DIM 100010
#define x second
#define y first

using namespace std;

struct secv {
    int st;
    int dr;
    int tip;
};

secv s[DIM];
pair<int, int> v[DIM];
int c, n, m, i, j, X1, X2, Y1, Y2, L, k, st, dr, mid, in1, in2, z1, z2, pls;

ifstream fin ("gropi.in");
ofstream fout("gropi.out");

int main () {

    fin>>c>>n;
    for (i=1;i<=n;i++)
        fin>>v[i].x>>v[i].y;

    sort(v+1, v+n+1);

    if (n != 0) {
        L = 1;
        for (i=2;i<=n;i++)
            if (v[i].x == v[i-1].x)
                L++;
            else {
                k++;
                s[k].st = i-1-L+1;
                s[k].dr = i-1;
                s[k].tip = v[i-1].x;
                L = 1;
            }
        k++;
        s[k].st = i-1-L+1;
        s[k].dr = i-1;
        s[k].tip = v[i-1].x;

    }

    fin>>m;
    for (;m--;) {
        fin>>X1>>Y1>>X2>>Y2;
        if ((Y1 > Y2) || ( (Y1 == Y2) && (X1 > X2) )) {
            swap(X1, X2);
            swap(Y1, Y2);
        }

        /// caut zona in care se afla Y1 sau prima de dupa
        st = 1;
        dr = k;
        while (st <= dr) {
            mid = (st + dr)/2;
            if (Y1 >= s[mid].st && Y1 <= s[mid].dr)
                break;
            if (Y1 > s[mid].dr)
                st = mid+1;
            else
                dr = mid-1;
        }

        if(st <= dr) {
            in1 = 1;
            z1 = mid;
        } else {
            in1 = 0;
            z1 = st;
        }

        /// caut zona in care se afla Y2 sau prima de inainte
        st = 1;
        dr = k;
        while (st <= dr) {
            mid = (st + dr)/2;
            if (Y1 >= s[mid].st && Y1 <= s[mid].dr)
                break;
            if (Y1 > s[mid].dr)
                st = mid+1;
            else
                dr = mid-1;
        }
        if (st <= dr) {
            in2 = 1;
            z2 = mid;
        } else {
            in2 = 0;
            z2 = dr;
        }
        /// ambele capetele sunt in zone
        if (in1 && in2) {
            if (z1 == z2) {
                if (X1 != X2) {
                    fout<<Y2-Y1+1+1<<"\n";
                } else {
                    if (X1 != s[z1].tip)
                        fout<<Y2-Y1+1<<"\n";
                    else
                        fout<<Y2-Y1+1+2<<"\n";
                }
            } else {
                pls = z2 - z1;
                if (s[z1].tip == X1)
                    pls++;
                if (s[z2].tip == X2)
                    pls++;
                fout<<Y2-Y1+1+pls<<"\n";
            }
            continue;
        }
        if (!in1 && !in2) {
            if (z1 - 1 == z2) {
                if (X1 == X2)
                    fout<<Y2-Y1+1<<"\n";
                else
                    fout<<Y2-Y1+2<<"\n";
            } else {
                pls = z2 - z1;
                if (X1 == s[z1].tip)
                    pls++;
                if (X2 == s[z2].tip)
                    pls++;
                fout<<Y2-Y1+1+pls<<"\n";
            }
            continue;
        }

        pls = z2 - z1;
        if (X1 == s[z1].tip)
            pls++;
        if (X2 == s[z2].tip)
            pls++;
        fout<<Y2-Y1+1+pls<<"\n";

    }

    return 0;
}