Cod sursa(job #1612619)

Utilizator raluca1234Tudor Raluca raluca1234 Data 24 februarie 2016 22:43:37
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100000
using namespace std;

struct groapa{
    int x, y;
}g[MAXN+5];
struct interval{
    int st, dr, lin;
}v[100000];
int n;

bool cmp(groapa a, groapa b){
    return a.y<b.y;
}

int caut(int st, int dr, int val){
    int m;
    if (st>dr)
        return -1;
    else{
        m=(st+dr)/2;
        if (val>=v[m].st && val<=v[m].dr)
            return m;
        if (val<=v[m].st)
            return caut(st, m-1, val);
        else return caut(m+1, dr, val);
    }
}

int binarySearchR(int val){
    int last=0, st, dr, mij;
    st=1; dr=n;
    while (st<=dr){
        mij=(st+dr)/2;
        if (val<=g[mij].y){
            last=mij;
            dr=mij-1;
        }
        else {
            st=mij+1;
        }
    }
    return last;
}

int main(){
    int c, i, stanga, nrint, m, q, x1, y1, x2, y2, ans, z1, z2, gpoz;
    freopen("gropi.in", "r", stdin);
    freopen("gropi.out", "w", stdout);
    scanf("%d%d", &c, &n);
    for (i=1; i<=n; i++)
        scanf("%d%d", &g[i].x, &g[i].y);
    sort(g+1, g+n+1, cmp);
    stanga=1;
    nrint=0;
    g[n+1].x=(g[n].x+1)%3;
    g[n+1].y=c+1;

    for (i=2; i<=n+1; i++){
        if (g[i].x!=g[i-1].x){
            nrint++;
            v[nrint].st=stanga;
            v[nrint].dr=g[i].y-1;
            stanga=g[i].y;
            v[nrint].lin=g[i-1].x;
        }
    }
    scanf("%d", &m);
    for (q=1; q<=m; q++){
        scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
        if (y1==y2)
            printf("1\n");
        else{
            if (y1>y2){
                swap(x1,x2);
                swap(y1,y2);
            }
            ans=y2-y1+1;
            z1=caut(1, nrint, y1);
            if (v[z1].lin==x1){
                //Caut binar cea mai apropiata groapa din dreapta pozitiei de inceput
                gpoz=binarySearchR(y1);
                if (x1!=g[gpoz].x)
                    ans+=0;
                else ans+=2;
            }else
                ans++;
            z2=caut(1, nrint, y2);
            if (v[z2].lin==x2) ans++;
            ans+=z2-z1-1;
            printf("%d\n", ans);
        }
    }

    return 0;
}