Cod sursa(job #644842)

Utilizator rootsroots1 roots Data 7 decembrie 2011 18:35:10
Problema Zoo Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <cstdio>
#include <algorithm>

#define buffSize 131072
#define vSize 16001

#define TWidth 16001
#define THeight 19

using namespace std;

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

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

int T[THeight][TWidth];

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

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

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

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

    val*=neg;
}

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

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

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

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

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

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

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

    int M=(L+R)>>1;
    if(a<=v[M].x) query(level+1,L,M,a,b,y1,y2);
    if(v[M].x<b) query(level+1,M+1,R,a,b,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,cmp);
    for(logN=0;(1<<logN)<N;++logN);
    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;
}