Cod sursa(job #197674)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 5 iulie 2008 13:48:39
Problema Gropi Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.58 kb
#include<stdio.h>
long n,m,g[100002][3],i,j,c,is,xa,xb,ya,yb,dist[100002],g1,g2,sol,aux;
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++)
        dist[i]=(g[i][1]==g[i-1][1])?dist[i-1]+g[i][2]-g[i-1][2]:dist[i-1]+g[i][2]-g[i-1][2]+1;

        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;
                   }
          j=1;
          while(g[j][2]<ya) j++; g1=j;
          if(yb>g[n][2]) g2=n;
          else {while(g[j][2]) j++; g2=j-1;}
          sol=dist[g2]-dist[g1]+1;
          sol+=(g[g1][1]==xa)?g[g1][2]-ya+1:g[g1][2]-ya;
          sol+=(g[g2][1]==xb)?yb-g[g2][2]+1:yb-g[g2][2];
          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;
}