- #include <iostream> 
- #include <tuple> 
- #include <chrono> 
- using namespace std; 
- using namespace std::chrono; 
-   
- void safe_swap(int* a, int* b) { 
-     if (a != b) 
-         *b ^= *a ^= *b, *a ^= *b; 
- } 
- void classic_swap(int*a, int*b) { 
-     if (a!=b) { 
-         int tmp;  
-         tmp=*a;*a=*b;*b=tmp; 
-     }    
- } 
- void modern_swap(int*a, int*b) { 
-     if (a!=b)  
-         tie(*a,*b)=make_pair(*b,*a); 
- } 
-   
- long long benchmark(void(*f)(int*,int*)) { 
- 	int a,b;  
- 	long long mytime; 
- 	high_resolution_clock::time_point t = high_resolution_clock::now(); 
- 	a = rand();  
-   
- 	for (unsigned i=0; i<200000000; i++) { 
- 		b = rand(); 
- 		f(&a,&b);  
- 	} 
- 	high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
- 	mytime = duration_cast<milliseconds>(t2 - t).count(); 
- 	return mytime;  
- } 
-   
- int main() { 
- 	auto t1 = benchmark (safe_swap); 
- 	auto t2 = benchmark (modern_swap); 
- 	cout << "xor:   "<<t1<<" ms" <<endl; 
- 	cout << "modern:"<<t2<<" ms" <<endl; 
- 	cout << "rel xor time: " << static_cast<double>(t1)/t2*100 <<"%"<<endl; 
- 	return 0; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxjaHJvbm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKCnZvaWQgc2FmZV9zd2FwKGludCogYSwgaW50KiBiKSB7CiAgICBpZiAoYSAhPSBiKQogICAgICAgICpiIF49ICphIF49ICpiLCAqYSBePSAqYjsKfQp2b2lkIGNsYXNzaWNfc3dhcChpbnQqYSwgaW50KmIpIHsKICAgIGlmIChhIT1iKSB7CiAgICAgICAgaW50IHRtcDsgCiAgICAgICAgdG1wPSphOyphPSpiOypiPXRtcDsKICAgIH0gICAKfQp2b2lkIG1vZGVybl9zd2FwKGludCphLCBpbnQqYikgewogICAgaWYgKGEhPWIpIAogICAgICAgIHRpZSgqYSwqYik9bWFrZV9wYWlyKCpiLCphKTsKfQoKbG9uZyBsb25nIGJlbmNobWFyayh2b2lkKCpmKShpbnQqLGludCopKSB7CglpbnQgYSxiOyAKCWxvbmcgbG9uZyBteXRpbWU7CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CglhID0gcmFuZCgpOyAKCQkKCWZvciAodW5zaWduZWQgaT0wOyBpPDIwMDAwMDAwMDsgaSsrKSB7CgkJYiA9IHJhbmQoKTsKCQlmKCZhLCZiKTsgCgl9CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJbXl0aW1lID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHQyIC0gdCkuY291bnQoKTsKCXJldHVybiBteXRpbWU7IAp9CgppbnQgbWFpbigpIHsKCWF1dG8gdDEgPSBiZW5jaG1hcmsgKHNhZmVfc3dhcCk7CglhdXRvIHQyID0gYmVuY2htYXJrIChtb2Rlcm5fc3dhcCk7Cgljb3V0IDw8ICJ4b3I6ICAgIjw8dDE8PCIgbXMiIDw8ZW5kbDsKCWNvdXQgPDwgIm1vZGVybjoiPDx0Mjw8IiBtcyIgPDxlbmRsOwoJY291dCA8PCAicmVsIHhvciB0aW1lOiAiIDw8IHN0YXRpY19jYXN0PGRvdWJsZT4odDEpL3QyKjEwMCA8PCIlIjw8ZW5kbDsKCXJldHVybiAwOwp9