Cod sursa(job #197612)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 5 iulie 2008 12:10:44
Problema Gropi Scor 10
Compilator cpp Status done
Runda Junior Challenge 2008 Marime 2.03 kb
#include <set>
#include <map>
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
#include <algorithm>

using namespace std;

#define mp make_pair
#define pb push_back
#define sz(c) (int)((c).size())
#define f first
#define s second
#define all(c) c.begin(),c.end()
#define pw(c) (1 << c)

#define fin  "gropi.in"
#define fout "gropi.out"

const int Nmax = 100100;

int N,C,M;
vector < pair<int,int> > v;

int sum[Nmax];
int ret;

inline int bsearch(int upperLimit)
{
    int lo,hi,m;
    
    lo = 0; hi = N - 1;
    
    while ( lo < hi )
    {
          m = ( lo + hi ) / 2;
          
          if ( v[ m ].f < upperLimit )
             lo = m + 1;
          else
             hi = m - 1;
    }
    
    return lo - 1;
}

void readdata_solve()
{
     int x,y,i;
     int xa,ya,xb,yb;
     int p1,p2;
     
     freopen(fin,"r",stdin);
     freopen(fout,"w",stdout);
     
     scanf("%d%d",&C,&N);
       
     for ( i = 1; i <= N; ++i )
     {
         scanf("%d%d",&x,&y);
         v.pb(mp(y,x));    
     }
     
     sort(v.begin(),v.end());
     
     sum[0] = 0;
     for ( i = 1; i < sz(v); ++i )
         if ( v[i].s != v[i-1].s )
            sum[i] = sum[i-1] + 1;
         else
            sum[i] = sum[i-1];

     scanf("%d",&M);
     
     for ( i = 1; i <= M; ++i )
     {
         scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
         if ( ya > yb )
            swap(xa,xb), swap(ya,yb);
            
         ret = yb - ya + 1;
         
         p1 = bsearch(ya);
         p2 = bsearch(yb);
         
         //printf("%d %d ",p1,p2);
         if ( p1 != p2 )
         {
            ret += sum[ p2 ] - sum[ p1 + 1 ];
         
            if ( v[ p1 + 1 ].s == xa )
               ++ret;
            if ( v[ p2 ].s == xb )
                ++ret;
         }
         else
         if ( xa != xb )
            ++ret;
               
         printf("%d\n",ret);               
     }
}

int main()
{
    readdata_solve();
    return 0;   
}