Cod sursa(job #197721)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 5 iulie 2008 16:10:26
Problema Gropi Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
long n,m,g[100002][3],i,j,c,is,xa,xb,ya,yb,dist[100002],g1,g2,sol,aux,dif;
void sort();
void heapdown(long ii, long nn);
void swap(long a, long b);
int main()
{       freopen("gropi.in","r",stdin); freopen("gropi.out","w",stdout);
        scanf("%ld%ld",&c,&n);
        for(i=1;i<=n;i++) scanf("%ld%ld",&g[i][1],&g[i][2]);
        sort();

        dist[1]=0;
        for(i=2;i<=n;i++)
        { dif=g[i][2]-g[i-1][2];
          if(g[i][1]!=g[i-1][1])dif++;
          dist[i]=dist[i-1]+dif;
        }

        scanf("%ld",&m);
        for(i=1;i<=m;i++)
        { scanf("%ld%ld%ld%ld",&xa,&ya,&xb,&yb);
          if(ya>yb){ aux=ya; ya=yb; yb=aux;
                     aux=xa; xa=xb; xb=aux;
                   }
          if(yb<g[1][2]||ya>g[n][2])sol=yb-ya+1;
          else
          { j=1;while(g[j][2]<=ya) j++; g1=j;
            j=n;while(g[j][2]>=yb) j--; g2=j;
          sol=dist[g2]-dist[g1]+1;
          sol+=(g[g1][1]==xa)?g[g1][2]-ya:g[g1][2]-ya+1;
          sol+=(g[g2][1]==xb)?yb-g[g2][2]:yb-g[g2][2]+1;
         }
          printf("%ld\n",sol);
        }
          return 0;
}
void sort()
{       for(i=n/2;i>=1;i--) heapdown(i,n);
        for(i=n;i>=1;i--) { swap(1,i);
                            heapdown(1,i-1);
                           }
}
void heapdown(long ii, long nn)
{       if(2*ii>nn) return;
        is=2*ii;
        if(2*ii<nn) if(g[2*ii][2]<g[2*ii+1][2]) is=2*ii+1;
        if(g[ii][2]<g[is][2]){ swap(ii,is); heapdown(is,nn);}
        return;
}
void swap(long a, long b)
{
        aux=g[a][1]; g[a][1]=g[b][1]; g[b][1]=aux;
        aux=g[a][2]; g[a][2]=g[b][2]; g[b][2]=aux;
}