Cod sursa(job #1611191)

Utilizator raluca1234Tudor Raluca raluca1234 Data 23 februarie 2016 23:16:02
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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];

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 main(){
    int c, n, i, stanga, nrint, m, q, x1, y1, x2, y2, ans, z1, z2;
    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){
            swap(x1,x2);
            swap(y1,y2);
        }
        ans=y2-y1+1;
        z1=caut(1, nrint, y1);
        if (v[z1].lin==x1) ans++;
        z2=caut(1, nrint, y2);
        if (v[z2].lin==x2) ans++;
        ans+=z2-z1;
        printf("%d\n", ans);
    }

    return 0;
}