Cod sursa(job #204557)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 25 august 2008 08:57:13
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <bitset>
#define min(a,b) ((a<b)?a:b)

using namespace std;

long n,m,T,i,j,t,p,l,c,l1,l2,c1,c2;
long v[100005],ind[1005],nr1,nr2;
bitset<100005> line;

long bs(long x){
     long low=1,high=m,mid;
     while (low<high){
           mid=(low+high)/2;
           if (v[ind[mid]]>=x)
              high=mid;
           else low=mid+1;
     }
     if (t==1)return low+1;
     else return low-1;
}

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

int main(){
    freopen("gropi.in","r",stdin);
    freopen("gropi.out","w",stdout);
    
    scanf("%ld %ld",&n,&m);
    for (i=1;i<=m;i++){
        scanf("%ld %ld",&l,&c);
        v[i]=c;
        line[i]=l-1;
        ind[i]=i;
    }
    qsort(ind+1,m,sizeof(long),comp);
    scanf("%ld",&T);
    for (i=1;i<=T;i++){
        scanf("%ld %ld %ld %ld",&l1,&c1,&l2,&c2);
        if (c2<c1){c=c1;c1=c2;c2=c;c=l1;l1=l2;l2=c;}
        t=1;nr1=bs(c1);
        t=2;nr2=bs(c2);
        c=c2-c1+1;
        for (j=nr1;j<nr2;j++)
            if (line[ind[j]]^line[ind[j+1]])c++;
        if (nr1<=nr2){
           if (line[ind[nr1]]==l1-1)c++;
           if (line[ind[nr2]]==l2-1)c++;
        }
        else if (l1!=l2)c++;
        printf("%ld\n",c);
    }
    
return 0;
}