Cod sursa(job #197852)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 6 iulie 2008 18:24:49
Problema Gropi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.92 kb
# include <stdio.h>

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

int N,k,i,x,y,T;
int C[MAXN];
int L[MAXN];
int poz[MAXN];

    void swap(int &a, int &b)
    {
        int aux;
        aux = a;
        a = b;
        b = aux;
    }     

    void down(int i, int N)
    {
        int tata,fiu;
        tata = i;
        fiu = i << 1;
        while (fiu <= N)
          {
              if (fiu < N && C[fiu]<C[fiu+1]) fiu++;
              if (C[tata]<C[fiu])
                {
                    swap(C[tata],C[fiu]);
                    swap(L[tata],L[fiu]);
                    
                    tata = fiu;
                    fiu = fiu << 1;
                }
              else fiu = N+1;
          }
         
    }
    
    void heap(int N)
    {
        int i;
        for (i = N/2; i >= 1; --i)
          down(i,N);
        for (i = N; i > 1; --i)
          {
               swap(C[1],C[i]);
               swap(L[1],L[i]);
               
               down(1,i-1);
          } 
    }
    
    int search(int val)
    {
        int st,dr,mij,rez;
        st = 0;
        dr = N+1;
        while (st <= dr)
          {
              mij = (st + dr) >> 1;
              if (C[mij] <= val)
                {
                    rez = mij;
                    st = mij + 1;
                }
              else dr = mij - 1;
          }
        
        return rez;
    }
    
    int verif(int x,int y,int ok)
    {
        if (poz[x] == poz[x+1])
          if (L[x] == y) 
            if (ok == 1) return poz[x]-1;
            else return poz[x]+1;
          else return poz[x];
        if (poz[x] != poz[x+1])
          if (L[x] == y) return poz[x+1];
                    else return poz[x];
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d",&k,&N);
        for (i = 1; i <= N; ++i)
          scanf("%d%d",&L[i],&C[i]);
          
        heap(N);
        
        int ct = 0;
        if (L[1] == 1) L[0] = 2;
                  else L[0] = 1;
        if (L[N] == 1) L[N+1]= 2;
                  else L[N+1] = 1;
        C[N+1]=k+1;
        for (i = 1; i <= N+1; ++i)
          if (L[i-1] != L[i]) poz[i] = ++ct;
            else poz[i] = ct;
        
        scanf("%d",&T);
        int xi,yi,xf,yf,rez,t1,t2;
        for (i = 1; i <= T; ++i)
          {
              scanf("%d%d",&xi,&yi);
              scanf("%d%d",&xf,&yf);
              if (yf < yi) 
                 {
                     swap(xi,xf);
                     swap(yi,yf);
                 }
              x = search(yi);
              y = search(yf);
              rez = 0;
              t1 = verif(x,xi,1);
              t2 = verif(y,xf,2);
              rez = yf-yi+t2-t1+1;
              
              printf("%d\n",rez);
          }
        return 0;        
    }