Cod sursa(job #1540697)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 3 decembrie 2015 01:10:14
Problema Zoo Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>A[100100];
struct pct{
    int x;
    int y;
}v[20100];
int cmp(pct a,pct b){
    return a.x<b.x;
}
int n,m,i,j,a,b,a1,b1,nr;
FILE *f,*g;
void upd(int nod,int st,int dr){
    if(st==dr){
        A[nod].push_back(st);
        return;
    }
    int mid=(st+dr)/2;
    upd(2*nod,st,mid);
    upd(2*nod+1,mid+1,dr);
    int i=0,j=0;
    a=2*nod;
    b=2*nod+1;
    while( i < A[a].size() && j < A[b].size() ){
        if( v[ A[a][i] ].y < v[ A[b][j] ].y ){
            A[nod].push_back(A[a][i]);
            i++;
        }
        else{
            A[nod].push_back(A[b][j]);
            j++;
        }
    }
    for(;i<A[a].size();i++)
        A[nod].push_back(A[a][i]);
    for(;j<A[b].size();j++)
        A[nod].push_back(A[b][j]);
}
void query(int nod,int st,int dr,int a1,int b1,int a2,int b2){
    if( a1 <= v[st].x && v[dr].x <= a2 ){
        int p,u,mid,poz;
        p=0;
        u=A[nod].size()-1;
        while(p<=u){
            mid=(p+u)/2;
            if( v[ A[nod][mid] ].y < b1 )
                p=mid+1;
            else
                u=mid-1;
        }
        poz=p;
        p=0;
        u=A[nod].size()-1;
        while(p<=u){
            mid=(p+u)/2;
            if( v[ A[nod][mid] ].y <= b2 )
                p=mid+1;
            else
                u=mid-1;
        }
        nr+=u-poz+1;
    }
    else{
        int mid=(st+dr)/2;
        if(v[mid].x>=a1)
            query(2*nod,st,mid,a1,b1,a2,b2);
        if(v[mid+1].x<=a2)
            query(2*nod+1,mid+1,dr,a1,b1,a2,b2);
    }
}
int main(){
    f=fopen("zoo.in","r");
    g=fopen("zoo.out","w");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++){
        fscanf(f,"%d%d",&v[i].x,&v[i].y);
    }
    sort(v+1,v+n+1,cmp);
    upd(1,1,n);
    fscanf(f,"%d",&m);
    while(m--){
        nr=0;
        fscanf(f,"%d%d%d%d",&a,&b,&a1,&b1);
        if( v[1].x > a1 || v[n].x < a )
            fprintf(g,"0\n");
        else{
            query(1,1,n,a,b,a1,b1);
            fprintf(g,"%d\n",nr);
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}