Cod sursa(job #644550)

Utilizator rootsroots1 roots Data 6 decembrie 2011 22:43:07
Problema Zoo Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <cstdio>
#include <algorithm>

#define logN 16
#define vSize 16001
#define TSize 32769
#define buffSize 131072

using namespace std;

char buff[buffSize];
bool ok=true;
int ind,d,cnt;

struct point
{
    int x,y;
}v[vSize];
int T[logN][TSize];

inline bool comp(const point &a,const point &b)
{
    if(a.x!=b.x) return a.x<b.x;
    else return a.y<b.y;
}

inline void read(int &x)
{
    if(ok)
    {
        ok=false;
        ind=0;
        fread(buff,1,buffSize,stdin);
    }

    int neg=1;

    if(buff[ind]=='-')
    {
        neg=-1;
        if(++ind==buffSize)
        {
            ind=0;
            fread(buff,1,buffSize,stdin);
        }
    }

    for(x=0;'0'<=buff[ind]&&buff[ind]<='9';)
    {
        x*=10;
        x+=buff[ind]-'0';

        if(++ind==buffSize)
        {
            ind=0;
            fread(buff,1,buffSize,stdin);
        }
    }

    for(;('0'>buff[ind]||'9'<buff[ind])&&buff[ind]!='-';)
        if(++ind==buffSize)
        {
            ind=0;
            fread(buff,1,buffSize,stdin);
        }

    x*=neg;
}

inline void update(int level,int L,int R)
{
    if(level>d) return;

    for(int i=L;i<=R;++i) T[level][i]=v[i].y;
    sort(T[level]+L,T[level]+R);

    int M=(L+R)>>1;

    update(level+1,L,M);
    update(level+1,M+1,R);
}

inline int lowBS(int x,int level,int L,int R)
{
    if(L<R)
    {
        int M=(L+R)>>1;

        if(x<=T[level][M]) return lowBS(x,level,L,M);
        else return lowBS(x,level,M+1,R);
    }
    else return L;
}

inline int highBS(int x,int level,int L,int R)
{
    if(L<R)
    {
        int M=(L+R)>>1;

        if(x<T[level][M]) return highBS(x,level,L,M);
        else return highBS(x,level,M+1,R);
    }
    else return L;
}

inline void query(int level,int L,int R,int x1,int x2,int y1,int y2)
{
    if(x1<=v[L].x&&v[R].x<=x2)
    {
        int pos1=lowBS(y1,level,L,R);
        int pos2=highBS(y2,level,L,R);
        cnt+=pos2-pos1+1;
        return;
    }

    int M=(L+R)>>1;
    if(x1<=v[M].x) query(level+1,L,M,x1,x2,y1,y2);
    if(x2>v[M].x) query(level+1,M+1,R,x1,x2,y1,y2);
}

int main()
{
    int M,N,x1,x2,y1,y2;

    freopen("zoo.in","r",stdin);

    read(N);
    for(int i=1;i<=N;++i)
    {
        read(v[i].x);
        read(v[i].y);
    }

    sort(v+1,v+N+1,comp);

    for(d=0;(1<<d)<N;++d);
    update(1,1,N);

    freopen("zoo.out","w",stdout);

    read(M);
    for(;M--;)
    {
        read(x1);
        read(y1);
        read(x2);
        read(y2);
        cnt=0;
        query(1,1,N,x1,x2,y1,y2);
        printf("%d\n",cnt);
    }

    return 0;
}