Cod sursa(job #197651)

Utilizator DjSefuWrong name DjSefu Data 5 iulie 2008 13:17:37
Problema Gropi Scor 0
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.23 kb
#include<stdio.h>
#include<string.h>
FILE *f=fopen("gropi.in","r"),
     *g=fopen("gropi.out","w");
unsigned int i,j,n,m,k,x,y,c,x1,y1,x2,y2,au,piv1,piv2,lt;
struct sortstr
{ unsigned int x;
  unsigned int y;
  unsigned int i;
} a[130000],b[130000];
int count[1024],index2[1024],p;
void radix(struct sortstr *a,struct sortstr *b,int byte)
{ memset(count,0,sizeof(count));
  for(i=1;i<=n;++i) ++count[(a[i].x>>byte)&1023];
  index2[0]=1;
  for(i=1;i<1024;++i) index2[i]=index2[i-1]+count[i-1];
  for(i=1;i<=n;++i) { p=index2[(a[i].x>>byte)&1023]++;
                      b[p].x=a[i].x;
                      b[p].y=a[i].y;
                    }
}
unsigned int bs(unsigned int v)
{
            unsigned int i, cnt;
            for(i=1,cnt=(1<<20); cnt; cnt>>=1)
                        if(i+cnt<=n)
                                    if(a[i+cnt].y<=v) i+=cnt;
          return i;  
}
void rad(struct sortstr *a)
{ radix(a,b,0);
  radix(b,a,10);
  radix(a,b,20);
  radix(b,a,30);
}
int main()
{ fscanf(f,"%d %d",&c,&n);
  a[1].x=1;
  a[1].y=0;
  for(i=1;i<=n;++i){ fscanf(f,"%d %d",&x,&y);
                     a[i+1].x=x;
                     a[i+1].y=y;
                   }
  a[n+2].x=1;
  a[n+2].y=c+1;
  n+=2;
  rad(a);
  --n;
  a[2].i=a[2].y-a[1].y;
  for(i=3;i<=n;++i)a[i].i=a[i].y-a[i-1].y+a[i-1].i;
  fscanf(f,"%d",&m);
  ++n;
  for(i=1;i<=m;++i) { fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
                      if(y1>y2){ au=y1;y1=y2;y2=au;au=x1;x1=x2;x2=au;}
                      piv1=bs(y1);
                      piv2=bs(y2);
                      while(a[piv1].y<y1) ++piv1;
                      while(a[piv2].y>y2)--piv2;
                      if(piv1>piv2){ lt=y2-y1+1;
                                     if(x2!=x1) ++lt;
                                   }
                      else{ lt=a[piv1].y-y1;
                            if(a[piv1].x==x1) ++lt;
                            lt+=a[piv2].i-a[piv1].i;
                            lt+=y2-a[piv2].y;
                            if(a[piv2].x==x2) ++lt;
                            ++lt;
                          }
                     fprintf(g,"%d\n",lt);
                   }
    fclose(f);
    fclose(g);
    return 0;
}