Cod sursa(job #1617789)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 27 februarie 2016 16:22:22
Problema Gropi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
///STL gone crazy
#include <algorithm>
#include <cstdio>
#include <tuple>
#include <vector>
#define mp make_pair //too bored inline crap
using namespace std;

typedef pair<int, int> poz;
typedef tuple<int, int, int> seq;
vector<poz> ps;
vector<seq> sq;

inline void lasa(int &n, int &m){ //pa svenska, "lasa" (med en 'a' umlaut) betyder "citeste" :)
    for(int x,y,i=0; i<n; ++i){
        scanf("%d%d",&y,&x);
        ps.push_back(mp(x,3-y));
    }
    sort(ps.begin(), ps.end());
    sq.push_back(make_tuple(0,0,0));
    for(auto i:ps){
        if(sq.empty())
            sq.push_back(make_tuple(i.first,i.first,i.second));

        else if(i.second==get<2>(sq.back()))
            get<1>(sq.back())=i.first;

        else
            sq.push_back(make_tuple(i.first,i.first,i.second));
    }
    scanf("%d",&m);
}

inline bool holes(int x, int y){
    return upper_bound(ps.begin(), ps.end(), make_pair(x,5))!=lower_bound(ps.begin(), ps.end(), make_pair(y,0));
}

inline int dist(poz a, poz b){
    if(a.first==b.first)
        return a!=b;
    int r=b.first-a.first+1;
    vector<seq>::iterator ia,ib;
    ia=upper_bound(sq.begin(), sq.end(), make_tuple(a.first,0,0))-1;
    ib=upper_bound(sq.begin(), sq.end(), make_tuple(b.first,0,0))-1;

    if(get<1>(*ia)<=a.first)
        ++ia;

    if(ia>=ib){ ///Same hole interval
        if(get<2>(*ia)==a.second && get<2>(*ib)==b.second) //on the same line
            return r;
        if(holes(a.first, b.first))//Hole between
            r+=2-(a.second!=b.second);
        else//no hole between
            r+=a.second!=b.second;
        return r;
    }
    else{
        if(ia==sq.begin())
            ia++;
        if(ib==sq.begin())
            ib++;
        r+=ib-ia;
        r+=a.second!=get<2>(*ia);
        r+=b.second!=get<2>(*ib);
    }
    return r;
}

int main(void){
    //freopen("dat.in","r",stdin);
    freopen("gropi.in","r",stdin);
    freopen("gropi.out","w",stdout);
    int n,m,c;
    poz a,b;
    scanf("%d%d",&c,&n);
    lasa(n,m);


    for(int i=0; i<m; ++i){
        scanf("%d%d%d%d",&a.second,&a.first,&b.second,&b.first);
        if(a>b)
            swap(a,b);
        printf("%d\n",dist(a,b));
    }
    return 0;
}