Cod sursa(job #1519215)

Utilizator CalinSpiridonSpiridon Calin CalinSpiridon Data 6 noiembrie 2015 23:53:58
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <algorithm>
using namespace std;

#define maxd 100010

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

struct gr{
    int x,y;
};
gr v[maxd];
bool test(gr a, gr b){
    if(a.y<b.y) return 1;
    return 0;
}

int c, n, m, s1, s2, c1, c2, dist;
int d[maxd];

int cautare(int bb){
    if(bb<v[1].y) return 0;
    if(bb>=v[n].y) return n;
    int st=1, dr=n;
    int mj=0;
    while(st+1<dr){
        mj=(st+dr)/2;
        if(bb<v[mj].y) dr=mj;
        else st=mj;
    }
    return st;
}

int main(){
    fin>>c>>n;
    for(int i=1;i<=n;++i) fin>>v[i].x>>v[i].y;
    sort(v+1, v+n+1, test);
    for(int i=2;i<=n;++i){
        d[i]=d[i-1];
        if(v[i].x!=v[i-1].x) d[i]++;
    }
    fin>>m;
    for(;m;--m){
        fin>>s1>>c1>>s2>>c2;
        if(c1==c2) fout<<abs(s1-s2)+1<<'\n';
        else{
            if(c1>c2) swap(c1, c2), swap(s1,s2);
            int p1=cautare(c1);
            int p2=cautare(c2);
            dist=c2-c1+1;
            if(p1==p2){
                dist+=abs(s1-s2);
            }
            else{
                if(s1==v[p1+1].x) dist++;
                if(s2==v[p2].x) dist++;
                dist+=d[p2]-d[p1+1];
            }
            fout<<dist<<'\n';

        }
    }

    return 0;
}