#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// --- GEOMETRIC STRUCTURES ---
class Rectangle {
public:
int id;
double minX, minY, maxX, maxY;
// The core geometric relation check
bool intersects(const Rectangle& other) const {
return !(minX > other.maxX || maxX < other.minX ||
minY > other.maxY || maxY < other.minY);
}
};
// --- PROVIDED TREE LIBRARY (Simulated with Vector) ---
class GeoTree {
private:
// Internal storage simulating the Tree's dataset
vector<Rectangle> treeData;
public:
/**
* Requirement: Add operation takes O(log n) in a real tree.
* Here we use push_back for the simulation.
*/
void addRectangle(int id, Rectangle r) {
r.id = id;
treeData.push_back(r);
}
/**
* Requirement: Query operation takes O(log n) in a real tree.
* In a real library, this would only visit branches that overlap with q.
*/
vector<int> queryRectangle(Rectangle q) {
vector<int> results;
for (const auto& rect : treeData) {
if (rect.intersects(q)) {
results.push_back(rect.id);
}
}
return results;
}
};
void mapCase1 (vector<Rectangle> uscities,vector<Rectangle> largeTableBPartition)
{
GeoTree geotree;
for(auto city :uscities )
{
geotree.addRectangle(city.id,city);
}
for(auto trip :largeTableBPartition )
{
vector<int> visitedCities = geotree.queryRectangle(trip);
for(auto city : visitedCities )
{
cout<<"Intersecting cities for trip :"<<trip.id<<" are :" <<city<<"\n";
}
}
}
int main() {
// TABLE A: Small Table (e.g., US City Boundaries)
vector<Rectangle> cities = {
{1, 0.0, 0.0, 5.0, 5.0},
{2, 10.0, 10.0, 15.0, 15.0}
};
// TABLE B: Large Table Partition (e.g., Uber Trips on local node)
vector<Rectangle> trips = {
{101, 2.0, 2.0, 3.0, 3.0},
{102, 4.0, 4.0, 6.0, 6.0},
{103, 12.0, 12.0, 18.0, 18.0},
{104, 20.0, 20.0, 25.0, 25.0}
};
mapCase1(cities, trips);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIC0tLSBHRU9NRVRSSUMgU1RSVUNUVVJFUyAtLS0KCmNsYXNzIFJlY3RhbmdsZSB7CglwdWJsaWM6CiAgICBpbnQgaWQ7CiAgICBkb3VibGUgbWluWCwgbWluWSwgbWF4WCwgbWF4WTsKCiAgICAvLyBUaGUgY29yZSBnZW9tZXRyaWMgcmVsYXRpb24gY2hlY2sKICAgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBSZWN0YW5nbGUmIG90aGVyKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICEobWluWCA+IG90aGVyLm1heFggfHwgbWF4WCA8IG90aGVyLm1pblggfHwgCiAgICAgICAgICAgICAgICAgbWluWSA+IG90aGVyLm1heFkgfHwgbWF4WSA8IG90aGVyLm1pblkpOwogICAgfQp9OwoKLy8gLS0tIFBST1ZJREVEIFRSRUUgTElCUkFSWSAoU2ltdWxhdGVkIHdpdGggVmVjdG9yKSAtLS0KCmNsYXNzIEdlb1RyZWUgewpwcml2YXRlOgogICAgLy8gSW50ZXJuYWwgc3RvcmFnZSBzaW11bGF0aW5nIHRoZSBUcmVlJ3MgZGF0YXNldAogICAgdmVjdG9yPFJlY3RhbmdsZT4gdHJlZURhdGE7CgpwdWJsaWM6CiAgICAvKioKICAgICAqIFJlcXVpcmVtZW50OiBBZGQgb3BlcmF0aW9uIHRha2VzIE8obG9nIG4pIGluIGEgcmVhbCB0cmVlLgogICAgICogSGVyZSB3ZSB1c2UgcHVzaF9iYWNrIGZvciB0aGUgc2ltdWxhdGlvbi4KICAgICAqLwogICAgdm9pZCBhZGRSZWN0YW5nbGUoaW50IGlkLCBSZWN0YW5nbGUgcikgewogICAgICAgIHIuaWQgPSBpZDsKICAgICAgICB0cmVlRGF0YS5wdXNoX2JhY2socik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXF1aXJlbWVudDogUXVlcnkgb3BlcmF0aW9uIHRha2VzIE8obG9nIG4pIGluIGEgcmVhbCB0cmVlLgogICAgICogSW4gYSByZWFsIGxpYnJhcnksIHRoaXMgd291bGQgb25seSB2aXNpdCBicmFuY2hlcyB0aGF0IG92ZXJsYXAgd2l0aCBxLgogICAgICovCiAgICB2ZWN0b3I8aW50PiBxdWVyeVJlY3RhbmdsZShSZWN0YW5nbGUgcSkgewogICAgICAgIHZlY3RvcjxpbnQ+IHJlc3VsdHM7CiAgICAgICAgZm9yIChjb25zdCBhdXRvJiByZWN0IDogdHJlZURhdGEpIHsKICAgICAgICAgICAgaWYgKHJlY3QuaW50ZXJzZWN0cyhxKSkgewogICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoX2JhY2socmVjdC5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9Cn07Cgp2b2lkIG1hcENhc2UxICh2ZWN0b3I8UmVjdGFuZ2xlPiB1c2NpdGllcyx2ZWN0b3I8UmVjdGFuZ2xlPiBsYXJnZVRhYmxlQlBhcnRpdGlvbikKewoJR2VvVHJlZSBnZW90cmVlOwoJZm9yKGF1dG8gY2l0eSA6dXNjaXRpZXMgKQoJewoJCWdlb3RyZWUuYWRkUmVjdGFuZ2xlKGNpdHkuaWQsY2l0eSk7Cgl9CgkKCWZvcihhdXRvIHRyaXAgOmxhcmdlVGFibGVCUGFydGl0aW9uICkKCXsKCQl2ZWN0b3I8aW50PiB2aXNpdGVkQ2l0aWVzID0gCWdlb3RyZWUucXVlcnlSZWN0YW5nbGUodHJpcCk7CgkJZm9yKGF1dG8gY2l0eSA6IHZpc2l0ZWRDaXRpZXMgKQoJCXsKCQkJY291dDw8IkludGVyc2VjdGluZyBjaXRpZXMgZm9yIHRyaXAgOiI8PHRyaXAuaWQ8PCIgYXJlIDoiIDw8Y2l0eTw8IlxuIjsKCQl9CgkJCgl9Cn0KaW50IG1haW4oKSB7CiAgICAvLyBUQUJMRSBBOiBTbWFsbCBUYWJsZSAoZS5nLiwgVVMgQ2l0eSBCb3VuZGFyaWVzKQogICAgdmVjdG9yPFJlY3RhbmdsZT4gY2l0aWVzID0gewogICAgICAgIHsxLCAwLjAsIDAuMCwgNS4wLCA1LjB9LCAgIAogICAgICAgIHsyLCAxMC4wLCAxMC4wLCAxNS4wLCAxNS4wfSAKICAgIH07CgogICAgLy8gVEFCTEUgQjogTGFyZ2UgVGFibGUgUGFydGl0aW9uIChlLmcuLCBVYmVyIFRyaXBzIG9uIGxvY2FsIG5vZGUpCiAgICB2ZWN0b3I8UmVjdGFuZ2xlPiB0cmlwcyA9IHsKICAgICAgICB7MTAxLCAyLjAsIDIuMCwgMy4wLCAzLjB9LCAgIAogICAgICAgIHsxMDIsIDQuMCwgNC4wLCA2LjAsIDYuMH0sICAgCiAgICAgICAgezEwMywgMTIuMCwgMTIuMCwgMTguMCwgMTguMH0sIAogICAgICAgIHsxMDQsIDIwLjAsIDIwLjAsIDI1LjAsIDI1LjB9ICAKICAgIH07CgogICAgbWFwQ2FzZTEoY2l0aWVzLCB0cmlwcyk7CgogICAgcmV0dXJuIDA7Cn0=