Cod sursa(job #197638)

Utilizator katakunaCazacu Alexandru katakuna Data 5 iulie 2008 12:47:17
Problema Gropi Scor 100
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 1.29 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

struct gr {int x,y;}g[100102];
int rez,u,mij,x1,x2,y1,y2,c,n,m,i,p,C[100102];

int cmp(gr a,gr b){
return a.y<b.y;
}

int main(){

FILE *f=fopen("gropi.in","r");
fscanf(f,"%d %d",&c,&n);

  for(i=1;i<=n;i++)
  fscanf(f,"%d %d",&g[i].x,&g[i].y);

sort(g+1,g+n+1,cmp);

p=0;

int k=0;

fscanf(f,"%d",&m);

 for(i=2;i<=n;i++){
 C[i]=C[i-1]+g[i].y-g[i-1].y;
   if(g[i].x!=g[i-1].x)
   C[i]++;
 }


FILE *gg=fopen("gropi.out","w");
int aux;
int pp;

  for(i=1;i<=m;i++){
  fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
  //caut binar cea mai apropiata groapa

    if(y1>y2){
    aux=y1;y1=y2; y2=aux;
    aux=x1;x1=x2; x2=aux;
    }

  p=1;
  u=n;
  
    while(p<=u){
    mij=(p+u)/2;

      if(y1<=g[mij].y)
      u=mij-1;
      else
      p=mij+1;
    
    }

   rez=g[p].y-y1+1;

   if(g[p].x==x1)
   rez++;

  //caut ultima groapa
  pp=p;
  p=1;
  u=n;
  
    while(p<=u){
    mij=(p+u)/2;

      if(y2>=g[mij].y)
      p=mij+1;

      else
      u=mij-1;
    
    }

  rez+=C[u]-C[pp];
  rez+=y2-g[u].y;
  if(x2==g[u].x)
  rez++;

   if(pp>u){
   rez=y2-y1+1;
      if(x1!=x2)
      rez++;
   }

  fprintf(gg,"%d\n",rez);
  }
  

fclose(f);
fclose(gg);
return 0;
}