Cod sursa(job #197592)

Utilizator CezarMocanCezar Mocan CezarMocan Data 5 iulie 2008 11:31:09
Problema Gropi Scor 10
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.39 kb
#include <cstdio>
#include <algorithm>

using namespace std;

long c,i,j,n,m,l1,c1,l2,c2,v[3][100100],aux,a,b,nr1,nr2,x[3][100100],poz,lc,rez;

long caut_bin1(long nr, long l, long r)
    {
    if (nr<v[1][1])
        return 1;
    long m=(l+r)/2;
    if (v[1][m]>nr&&v[1][m-1]<nr)
        return m;
    if (v[1][m]<nr)
        return caut_bin1(nr,m+1,r);
    else
        return caut_bin1(nr,l,m-1);    
    }
    
    
long caut_bin2(long nr, long l, long r)
    {
    if (nr<v[2][1])
        return 1;
    long m=(l+r)/2;
    if (v[2][m]>nr&&v[2][m-1]<nr)
        return m;
    if (v[2][m]<nr)
        return caut_bin2(nr,m+1,r);
    else
        return caut_bin2(nr,l,m-1);    
    }
    

int main(){
freopen("gropi.in","r",stdin);
freopen("gropi.out","w",stdout);    
scanf("%d%d",&c,&n);
for (i=1;i<=n;i++)
    {
    scanf("%d%d",&a,&b);
    if (a==1)
        {
        v[1][0]++;
        v[1][v[1][0]]=b;
        }
    else    
        {
        v[2][0]++;
        v[2][v[2][0]]=b;    
        }
/*    v[a][0]++;
    v[a][v[a][0]]=b;    */
    }
sort(v[1]+1,v[1]+v[1][0]+1);
sort(v[2]+1,v[2]+v[2][0]+1);
v[1][v[1][0]+1]=2000000000;
v[2][v[2][0]+1]=2000000000;
//precalcularea pentru v[1]
nr2=1;
for (i=1;i<=v[1][0];i++)
    {
    while ((v[2][nr2]<v[1][i])&&(nr2<=v[2][0]))
        nr2++;
    x[1][i]=nr2;    
    }
//precalcularea pentru v[2]
nr1=1;
for (i=1;i<=v[2][0];i++)
    {
    while ((v[1][nr1]<v[2][i])&&(nr1<=v[1][0]))
        nr1++;
    x[2][i]=nr1;    
    }
    
scanf("%d",&m);
for (i=1;i<=m;i++)
    {
    scanf("%d%d%d%d",&l1,&c1,&l2,&c2);
    if (c2<c1)
        {
        aux=l1;l1=l2;l2=aux;
        aux=c1;c1=c2;c2=aux;    
        }    
    rez=(c2-c1)+1;
    if (l1==1)
        {
        poz=caut_bin1(c1,1,v[1][0]);  
        lc=1;
        do
            {
            rez++;  
            poz=x[lc][poz];              
            lc=3-lc;
            } 
        while (v[lc][poz]<c2);            
        if (lc!=l2)
            rez++;
        }
    else
        {
        poz=caut_bin2(c1,1,v[2][0]);  
        lc=2;
        do
            {
            rez++;  
            poz=x[lc][poz];              
            lc=3-lc;
            }   
        while (v[lc][poz]<c2);            
        if (lc!=l2)
            rez++;          
        }
    printf("%d\n",rez);
    }
return 0;    
}