Cod sursa(job #198106)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 8 iulie 2008 15:25:24
Problema Gropi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.9 kb
# include <stdio.h>
# include <algorithm>

using namespace std;

# define FIN "gropi.in"
# define FOUT "gropi.out"
# define MAXN 100010

struct two
{
    long long c;
    long long l;
};

struct coord
{
    long long x,y;
};

two H[MAXN];
long long poz[MAXN];
long long N,M,C,i;
int I[3];
coord aux,pi,pf;

    long long cmp(two a, two b)
    {
       return a.c<b.c;
    }
    
    long long search(long long val)
    {
        long long st = 0, dr = N+1, mij, rez = 0;
        
        while (st <= dr)
          {
              mij = (st + dr) >> 1;
              if (H[mij].c <= val)
                {
                    rez = mij;
                    st = mij + 1;
                }
              else dr = mij - 1;
          }
        return rez;
    }
    
    long long ok(long long x1,long long x2,long long y1,long long y2)
    {
        long long sol = 0;
        if (x1 == x2)
          if (y1 == y2) sol = 0;
            else sol = 1;
        if (x1 != x2)
          {
               if (H[x2].l == H[x2+1].l)
                 if (H[x2].l == y2) sol = poz[x2] + 1;
                   else sol = poz[x2];
                   
               if (H[x2].l != H[x2+1].l)
                 if (H[x2].l == y2) sol = poz[x2] + 1;
                   else sol = poz[x2];
               
               if (H[x1].l == H[x1+1].l)
                 if (H[x1].l == y1) sol -= poz[x1] + 1;
                   else sol -= poz[x1];
                   
               if (H[x1].l != H[x1+1].l)
                 if (H[x1].l == y1) sol -= poz[x1] + 1;
                   else sol -= poz[x1];                
          }
        return sol;
    }
    
    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%lld %lld",&C,&N);
        for (i = 1; i <= N; ++i)
          scanf("%lld %lld",&H[i].l,&H[i].c);
          
        sort(H+1,H+N+1,cmp);
        
        long long ct, linie;
        linie = H[1].l;
        ct = 1;
        
        I[1] = 2; I[2] = 1;
        H[0].l = I[H[1].l];
        H[N+1].l = I[H[N].l];
        H[N+1].c = C+1;
        
        for (i = 1; i <= N+1; ++i)
          if (H[i].l != H[i-1].l) poz[i] = ++ct;
            else poz[i] = ct;
                     
        long long rez;
        scanf("%lld",&M);
        for (i = 1; i <= M; ++i)
          {
              scanf("%lld %lld",&pi.x,&pi.y);
              scanf("%lld %lld",&pf.x,&pf.y);
              
              if (pf.y < pi.y)
                {
                    aux = pf;
                    pf = pi;
                    pi = aux;
                }
                
              long long x1, x2;
              x1 = search(pi.y);
              x2 = search(pf.y);
              rez = pf.y - pi.y + 1 + ok(x1,x2,pi.x,pf.x);
              printf("%lld\n",rez);
          }
          
        return 0;
    }