Cod sursa(job #829217)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 4 decembrie 2012 22:16:28
Problema Zoo Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

ifstream in("zoo.in");
ofstream out("zoo.out");

const int MAX = 32000;

struct punct {
    int x, y;
};

inline bool cmpx(punct a, punct b) {
    return a.x < b.x;
}

vector<int> a[100000];
punct x[16010];
int i,j,n,m,qix,qiy,qsx,qsy,up[16010];

void build(int i, int li, int ls) {
    if(li > ls)
        return;
    if(li == ls) {
        a[i].push_back(x[li].y);
        return;
    }
    build(2*i, li, (li+ls)/2);
    build(2*i+1, (li+ls)/2+1, ls);
    a[i].resize(a[2*i].size() + a[2*i+1].size(), 0);
    vector<int>::iterator it1 = a[2*i].begin(), it2 = a[2*i+1].begin(), end1 = a[2*i].end(), end2 = a[2*i+1].end();
    while(it1 != end1 && it2 != end2) {
        if(*it1 < *it2) {
            a[i].push_back(*it1);
            ++ it1;
        } else {
            a[i].push_back(*it2);
            ++ it2;
        }
    }
    while(it1 != end1)
        a[i].push_back(*it1), ++it1;
    while(it2 != end2)
        a[i].push_back(*it2), ++it2;
}

int query(int i, int li, int ls, int lix, int liy, int lsx, int lsy) {
    if(x[ls].x < lix || x[li].x > lsx)
        return 0;

    if(lix <= x[li].x && lsx >= x[ls].x) {
        vector<int>::iterator start = lower_bound(a[i].begin(), a[i].end(), liy);
        vector<int>::iterator end   = upper_bound(a[i].begin(), a[i].end(), lsy);
        return end-start;
    }
    return query(2*i, li, (li+ls)/2, lix, liy, lsx, lsy) + query(2*i+1, (li+ls)/2+1, ls, lix, liy, lsx, lsy);
}

int readnext(char *s, int &j) {
    int v = 0, sgn=1;
    while(!(s[j] == '-' || s[j] >= '0' && s[j] <= '9'))
        ++ j;
    if(s[j] == '-') {
        sgn *= -1;
        ++ j;
    }
    while(s[j] >= '0' && s[j] <= '9') {
        v = v*10 + s[j] - '0';
        ++ j;
    }
    return v * sgn;
}

int main() {
    in>>n;
    for(i=1; i<=n; i++) {
        in>>x[i].x>>x[i].y;
    }
    sort(x+1, x+n+1, cmpx);
    build(1, 1, n);
    in>>m;
    int pos = in.tellg();
    in.seekg(0, ios::end);
    int end = in.tellg();
    in.seekg(pos, ios::beg);
    char *s = new char[end-pos+10];
    in.read(s, end-pos+10);
    for(i=1; i<=m; i++) {
        qix = readnext(s, j);
        qiy = readnext(s, j);
        qsx = readnext(s, j);
        qsy = readnext(s, j);
        out<<query(1, 1, n, qix, qiy, qsx, qsy)<<endl;
    }
    return 0;
}