Cod sursa(job #253279)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 16:59:32
Problema Gropi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
 #include <cstdio>  
 #include <algorithm>  
   
 using namespace std;  
   
 #define x first  
 #define y second  
 #define mp make_pair  
   
 int n, c, m;  
 pair<int, int> v[100005];  
 int s[100005];  
   
 int caut1(int X)   
 {  
     int st = 0, dr = n - 1, mij;  
     while (st != dr) {  
         mij = (st + dr) / 2;  
         if (v[mij].x <= X) st = mij + 1;  
         else dr = mij;  
     }  
     return st;  
 }  
   
 int caut2(int X)  
 {  
     int st = 0, dr = n - 1, mij;  
     while (st != dr) {  
         mij = (st + dr + 1) / 2;  
         if (v[mij].x < X) st = mij;  
         else dr = mij - 1;  
     }  
     return st;  
 }  
   
 int main()   
 {  
     freopen("gropi.in", "r", stdin);  
     freopen("gropi.out", "w", stdout);  
   
     int i, p1, p2, rez;  
     scanf("%d %d", &c, &n);  
   
     for (i = 0; i < n; ++i)  scanf("%d %d", &v[i].y, &v[i].x);  
   
     v[n++] = mp(0, 0);  
     v[n++] = mp(c + 1, 0);  
   
     sort(v, v + n);  
   
     s[0] = v[0].y != v[1].y;  
     for (i = 1; i + 1 < n; ++i)  s[i] = s[i-1] + (v[i].y != v[i+1].y);  
   
     scanf("%d", &m);  
     while (m--)  
     {  
         pair<int, int> a, b;  
   
         scanf("%d %d %d %d", &a.y, &a.x, &b.y, &b.x);  
         if (b < a) swap(a, b);  
   
         p1 = caut1(a.x);  
         if (v[p1].x >= b.x)  printf("%d\n", b.x-a.x + 1 + (a.y != b.y));  
         else   
         {  
             p2 = caut2(b.x);  
             rez = s[p2 - 1] - s[p1 - 1];  
   
             if (a.y == v[p1].y) ++rez;  
             if (b.y == v[p2].y) ++rez;  
   
             rez += b.x - a.x + 1;  
             printf("%d\n", rez);  
         }  
     }  
     return 0;  
}