Cod sursa(job #198109)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 8 iulie 2008 15:44:04
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 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,l;
};

long long N,k,i,x,y,T;
two H[MAXN];
long long poz[MAXN];

    long long cmp(two a,two b)
    {
         return a.c<b.c;
    }

    void swap(int &a,int &b)
    {
        int aux;
        aux = a;
        a = b;
        b = aux;
    }     
    
    long long search(long long val)
    {
        long long st,dr,mij,rez = 0;
        st = 0;
        dr = N+1;
        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 verif(long long xi,long long yi,long long xf,long long yf)
    {
        long long rez;
        if (xi == xf && yi == yf) return 0;
        if (xi == xf && yi != yf) return 1;
        if (H[xf].l == H[xf+1].l)
          if (H[xf].l == yf) rez = poz[xf]+1;
            else rez=poz[xf];
        if (H[xf].l != H[xf+1].l)
          if (H[xf].l == yf) rez=poz[xf+1];
            else rez=poz[xf];
        if (H[xi].l == H[xi+1].l)
          if (H[xi].l == yi) rez -= (poz[xi]-1);
            else rez -= poz[xi];
        if (H[xi].l != H[xi+1].l)
          if (H[xi].l == yi) rez -= poz[xi+1];
            else rez -= poz[xi];
        return rez;
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%lld%lld",&k,&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 = 0;
        if (H[1].l == 1) H[0].l = 2;
                    else H[0].l = 1;
        if (H[N].l == 1) H[N+1].l= 2;
                    else H[N+1].l = 1;
        H[N+1].c=k+1;
        for (i = 1; i <= N+1; ++i)
          if (H[i-1].l != H[i].l) poz[i] = ++ct;
            else poz[i] = ct;
        
        scanf("%lld",&T);
        long long xi,yi,xf,yf;
        long long rez;
        for (i = 1; i <= T; ++i)
          {
              scanf("%lld%lld",&xi,&yi);
              scanf("%lld%lld",&xf,&yf);
              if (yf < yi) 
                 {
                     swap(xi,xf);
                     swap(yi,yf);
                 }
              x = search(yi);
              y = search(yf);
              rez = verif(x,xi,y,xf);
              rez+=yf-yi+1;
              printf("%lld\n",rez);
          }
        return 0;        
    }