Cod sursa(job #207066)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 11 septembrie 2008 15:08:22
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <bitset>
using namespace std;
char line[131072];
long col[131072],ind[131072],s[131071];
long n,m,g,T,i,l,c,x,y,aux,sol;

int comp(const void * n1, const void * n2){
    return col[*((long*)n1)]-col[*((long*)n2)];
}

int bs1(int x){
    int low=1,high=g,mid;
    while (low<high){
       mid=(low+high)>>1;
       if (col[ind[mid]]<=x) low=mid+1;
       else high=mid;
    }
return low;
}
int bs2(int x){
    int low=1,high=g,mid;
    while (low<high){
       mid=(low+high+1)>>1;
       if (col[ind[mid]]<x) low=mid;
       else high=mid-1;
    }
return low;
}         

int main(){
    freopen("gropi.in","r",stdin);
    freopen("gropi.out","w",stdout);
    scanf("%ld %ld",&n,&g);
    for (i=1;i<=g;++i){
        scanf("%ld %ld",line+i,col+i);
        ind[i]=i;
    }
    //determinare numar de schimbari de linie
    line[++g]=0;col[g]=0;ind[g]=g;line[++g]=0;col[g]=n+1;ind[g]=g;
    qsort(ind+1,g,sizeof(long),comp);
    for (i=1;i<g;++i)
        if(line[ind[i]]!=line[ind[i+1]])s[i]=s[i-1]+1;
        else s[i]=s[i-1];

    scanf("%ld",&T);
    while (T--){
        scanf("%ld %ld %ld %ld",&l,&c,&x,&y);
        if (c>y){aux=c;c=y;y=aux;aux=l;l=x;x=aux;}
        aux=bs1(c);
        if (col[ind[aux]]>=y){printf("%ld\n",y-c+1+(l!=x));continue;}
        sol=-s[aux-1];
        if (l==line[ind[aux]])sol++;
        aux=bs2(y);
        sol+=s[aux-1];
        if (x==line[ind[aux]])sol++;

        printf("%ld\n",sol+y-c+1);
    }
return 0;
}