Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pb push_back
- #define pii pair<int,int>
- #define fi first
- #define se second
- #pragma GCC optimize("O3")
- #pragma GCC optimize("unroll-loops")
- using namespace std;
- main(){
- ios::sync_with_stdio(false);
- cin.tie(0);
- int n;
- cin>>n;
- vector< tuple<int,int,int,int> > v(n);
- vector<int> used(n,0);
- for(int i = 0; i < n; i++){
- int a,b,c;
- cin>>a>>b>>c;
- v[i] = make_tuple(a,b,c,i);
- }
- sort(v.begin(),v.end());
- map< pair<int,int>,vector<int> > m;
- for(int i = 0; i < n; i++){
- pair<int,int> t = {get<0>(v[i]),get<1>(v[i])};
- if(m.find(t)==m.end()) m[t] = vector<int>();
- m[t].pb(i);
- }
- for(auto t:m){
- //cout<<"x,y: "<<t.fi.fi<<" "<<t.fi.se<<" "<<endl;
- for(int i = 0; i+1 < t.se.size(); i+=2){
- //cout<<get<3>(v[t.se[i]])<<endl;
- cout<<get<3>(v[t.se[i]])+1<<" "<<get<3>(v[t.se[i+1]])+1<<"\n";
- used[get<3>(v[t.se[i]])] = 1;
- used[get<3>(v[t.se[i+1]])] = 1;
- }
- }
- vector<tuple<int,int,int,int> > v1;
- for(int i = 0; i < v.size(); i++){
- if(used[get<3>(v[i])]==0) v1.pb(v[i]);
- }
- map< int,vector<int> > m1;
- for(int i = 0; i < v1.size(); i++){
- if(m1.find(get<0>(v1[i]))==m1.end()){
- m1[get<0>(v1[i])] = vector<int>();
- }
- m1[get<0>(v1[i])].pb(i);
- }
- for(auto t:m1){
- for(int i = 0; i+1 < t.se.size(); i+=2){
- cout<<get<3>(v1[t.se[i]])+1<<" "<<get<3>(v1[t.se[i+1]])+1<<"\n";
- used[get<3>(v1[t.se[i]])] = 1;
- used[get<3>(v1[t.se[i+1]])] = 1;
- }
- }
- vector< tuple<int,int,int,int> > v2;
- for(int i = 0; i < v1.size(); i++){
- if(used[get<3>(v1[i])]==0){
- v2.pb(v1[i]);
- }
- }
- for(int i = 0; i < v2.size(); i+=2){
- cout<<get<3>(v2[i])+1<<" "<<get<3>(v2[i+1])+1<<"\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement