Cod sursa(job #1611964)

Utilizator hrazvanHarsan Razvan hrazvan Data 24 februarie 2016 16:54:30
Problema Gropi Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <stdio.h>
#define MAXN 100000
#define INF 2000000001
int v[2][MAXN + 1], d[2];
int drum[2 * MAXN], dd, pr;

inline int notm(int x){
  if(x & 1)
    return !pr;
  return pr;
}

inline int caut(int *v, int d, int p){
  int i = -1, pas;
  for(pas = (1 << 16); pas > 0; pas >>= 1){
    if(i + pas < d && v[i + pas] < p + 1)
      i += pas;
  }
  i++;
  return i;
}

void qs(int *v, int st, int dr){
  int i = st, j = dr, piv = v[(st + dr) / 2], aux;
  while(i <= j){
    while(v[i] < piv)  i++;
    while(v[j] > piv)  j--;
    if(i <= j){
      aux = v[i];  v[i] = v[j];  v[j] =aux;
      i++;  j--;
    }
  }
  if(st < j)  qs(v, st, j);
  if(i < dr)  qs(v, i, dr);
}

inline void calc(){
  if(v[0][0] < v[1][0])
    pr = 1;
  else
    pr = 0;
  drum[0] = v[pr][0];
  dd++;
  int p[2] = {0, 0}, cpr = pr;
  while(p[0] < d[0] && p[1] < d[1]){
    cpr = !cpr;
    while(v[cpr][p[cpr]] < v[!cpr][p[!cpr]])
      p[cpr]++;
    drum[dd] = v[cpr][p[cpr]];
    dd++;
  }
}

int main(){
  FILE *in = fopen("gropi.in", "r");
  int c, n, i, x, y, x1, y1, x2, y2, p1, p2, add;
  fscanf(in, "%d%d", &c, &n);
  for(i = 0; i < n; i++){
    fscanf(in, "%d%d", &x, &y);
    x--;  y--;
    v[x][d[x]] = y;
    d[x]++;
  }
  v[0][d[0]] = INF;
  v[1][d[1]] = INF;
  qs(v[0], 0, d[0] - 1);
  qs(v[1], 0, d[1] - 1);
  calc();
  int m, aux;
  fscanf(in, "%d", &m);
  FILE *out = fopen("gropi.out", "w");
  for(i = 0; i < m; i++){
    fscanf(in, "%d%d%d%d", &x1, &y1, &x2, &y2);
    x1--;  y1--;  x2--;  y2--;
    if(y1 > y2){
      aux = x1;  x1 = x2;  x2 = aux;
      aux = y1;  y1 = y2;  y2 = aux;
    }
    p1 = caut(drum, dd, y1);
    p2 = caut(drum, dd, y2);
    if(p1 != p2 || x1 != x2){
      add = p2 - p1;
      if(x1 != notm(p1))
        add++;
      if(x2 != notm(p2))
        add++;
    }
    else{
      p1 = caut(v[x1], d[x1], y1);
      p2 = caut(v[x1], d[x1], y2);
      if(p1 != p2)
        add = 2;
      else
        add = 0;
    }
    fprintf(out, "%d\n", add + y2 - y1 + 1);
  }
  fclose(in);
  fclose(out);
  return 0;
}