Cod sursa(job #1953005)

Utilizator robx12lnLinca Robert robx12ln Data 4 aprilie 2017 16:11:58
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<algorithm>
#define DIM 100005
using namespace std;
ifstream fin("gropi.in");
ofstream fout("gropi.out");

int n, m, X1, Y1, X2, Y2, k, sol, f[DIM];

struct str{
    int x;
    int y;
} v[DIM];

struct zone{
    int left;
    int right;
} a[DIM];

inline int cmp( const str &a, const str &b ){
    return a.y < b.y;
}

inline int det_zone( int x ){

    int st = 1;
    int dr = k;

    while( st <= dr ){

        int mid = ( st + dr ) / 2;

        if( a[mid].left <= x && x <= a[mid].right ){
            return mid;
        }

        if( a[mid].right < x )
            st = mid + 1;
        else{
            dr = mid - 1;
        }


    }

    return dr;

}

int main(){

    fin >> n >> m;

    for( int i = 1; i <= m; i++ ){

        fin >> v[i].x >> v[i].y;

    }

    sort( v + 1 , v + m + 1, cmp );

    k = 0;

    for( int i = 1; i <= m; i++ ){

        if( f[k] != v[i].x ){

            k++;
            f[k] = v[i].x;
            a[k].left = v[i].y;
            a[k].right = v[i].y;

        }else{

            a[k].right = v[i].y;

        }

    }

    a[1].left = 1;
    a[k].right = n;

    fin >> m;

    for( int t = 1; t <= m; t++ ){

        fin >> X1 >> Y1 >> X2 >> Y2;

        if( Y1 > Y2 ){

            swap( Y1, Y2 );
            swap( X1, X2 );

        }

        int z1 = det_zone( Y1 );
        int z2 = det_zone( Y2 );

        sol = Y2 - Y1 + 1;
        sol += z2 - z1;

        if( Y1 == Y2 ){
            fout << sol + 1 << "\n";
            continue;
        }

        if( X1 == f[z1] )
            sol++;
        if( X2 == f[z2] )
            sol++;

        fout << sol << "\n";

    }

    return 0;
}