Cod sursa(job #232927)

Utilizator zbarniZajzon Barna zbarni Data 16 decembrie 2008 14:37:46
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#define g 100005
using namespace std;
int N, C;
struct bar
 {
  int x,y;
 };
bar v[g];

int compare(const void *a, const void *b)
 {
  return (((bar*)a)->x-((bar*)b)->x);
 }
int S[g];

int search1(int X) {
    int st = 0, dr = N-1, mij;
    while (st != dr) {
	mij = (st + dr)/2;
	if (v[mij].x <= X) st = mij+1;
	else dr = mij;
    }
    return st;
}

int search2(int X) {
    int st = 0, dr = N-1, mij;
    while (st != dr) {
	mij = (st + dr + 1)/2;
	if (v[mij].x < X) st = mij;
	else dr = mij-1;
    }
    return st;
}

void swap (bar &A, bar &B)
 {
  bar q=A;
  A=B;
  B=q;
 }

int main() {
    freopen("gropi.in", "r", stdin);
    freopen("gropi.out", "w", stdout);
    int i;
    scanf("%d %d", &C, &N);
    for ( i = 0; i < N; ++i)
	scanf("%d %d", &v[i].y, &v[i].x);
    v[N].x=0;v[N++].y=0;
    v[N].x=C+1;v[N++].y=0;
    qsort(v,N,sizeof(bar),compare);

    S[0] = v[0].y != v[1].y;
    for (i = 1; i + 1 < N; ++i)
	S[i] = S[i-1] + (v[i].y != v[i+1].y);

    int M;
    for (scanf("%d", &M); M; --M) {
	bar A,B;
	scanf("%d %d %d %d", &A.y, &A.x, &B.y, &B.x);
	if (B.x < A.x) swap(A, B);

	int p1 = search1(A.x);
	if (v[p1].x >= B.x)
	    printf("%d\n", B.x-A.x + 1 + (A.y != B.y));
	else {
	    int p2 = search2(B.x);
	    int sz = S[p2-1] - S[p1-1];
	    if (A.y == v[p1].y) ++sz;
	    if (B.y == v[p2].y) ++sz;
	    sz += B.x-A.x+1;
	    printf("%d\n", sz);
	}
    }
  return 0;
}