- #include <cmath> 
- #include <mpi.h> 
-   
- class mpi { 
- public: 
-     static void init(int argc, char** argv) { 
-         MPI_Init(&argc, &argv); 
-   
-         MPI_Comm_rank(MPI_COMM_WORLD, &m_rank); 
-         MPI_Comm_size(MPI_COMM_WORLD, &m_size); 
-     } 
-   
-     static void finalize() { 
-         MPI_Finalize(); 
-     } 
-   
-     static int rank() noexcept { return m_rank; } 
-     static int size() noexcept { return m_size; } 
-   
-     static double min(double value) { 
-         double global_min = 0.0; 
-         MPI_Allreduce(&value, &global_min, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); 
-         return global_min; 
-     } 
-   
-     class master_stream  { 
-     public: 
-         template<class T> 
-         master_stream &operator<<(const T &x) { 
-             if (m_rank == 0) 
-                 std::cout << x; 
-             return *this; 
-         } 
-     }; 
-   
-     static inline master_stream cout{}; 
-     static inline char endl = '\n'; 
-   
- private: 
-     mpi() = default; 
-     static inline int m_rank = 0; 
-     static inline int m_size = 1; 
- }; 
-   
- int main(int argc, char** argv) { 
-     mpi::init(argc, argv); 
-   
-     double kek = cos(mpi::rank() + 10.0); 
-   
-     mpi::cout << "Hello, I'm master process" << mpi::endl; 
-     mpi::cout << "Min keks is " << mpi::min(kek) << mpi::endl; 
-   
-     mpi::finalize(); 
-     return 0; 
- } 
				I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8bXBpLmg+CgpjbGFzcyBtcGkgewpwdWJsaWM6CiAgICBzdGF0aWMgdm9pZCBpbml0KGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgICAgIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CgogICAgICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZtX3JhbmspOwogICAgICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZtX3NpemUpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIGZpbmFsaXplKCkgewogICAgICAgIE1QSV9GaW5hbGl6ZSgpOwogICAgfQoKICAgIHN0YXRpYyBpbnQgcmFuaygpIG5vZXhjZXB0IHsgcmV0dXJuIG1fcmFuazsgfQogICAgc3RhdGljIGludCBzaXplKCkgbm9leGNlcHQgeyByZXR1cm4gbV9zaXplOyB9CgogICAgc3RhdGljIGRvdWJsZSBtaW4oZG91YmxlIHZhbHVlKSB7CiAgICAgICAgZG91YmxlIGdsb2JhbF9taW4gPSAwLjA7CiAgICAgICAgTVBJX0FsbHJlZHVjZSgmdmFsdWUsICZnbG9iYWxfbWluLCAxLCBNUElfRE9VQkxFLCBNUElfTUlOLCBNUElfQ09NTV9XT1JMRCk7CiAgICAgICAgcmV0dXJuIGdsb2JhbF9taW47CiAgICB9CgogICAgY2xhc3MgbWFzdGVyX3N0cmVhbSAgewogICAgcHVibGljOgogICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgICAgbWFzdGVyX3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBUICZ4KSB7CiAgICAgICAgICAgIGlmIChtX3JhbmsgPT0gMCkKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCB4OwogICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgfQogICAgfTsKCiAgICBzdGF0aWMgaW5saW5lIG1hc3Rlcl9zdHJlYW0gY291dHt9OwogICAgc3RhdGljIGlubGluZSBjaGFyIGVuZGwgPSAnXG4nOwoKcHJpdmF0ZToKICAgIG1waSgpID0gZGVmYXVsdDsKICAgIHN0YXRpYyBpbmxpbmUgaW50IG1fcmFuayA9IDA7CiAgICBzdGF0aWMgaW5saW5lIGludCBtX3NpemUgPSAxOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICBtcGk6OmluaXQoYXJnYywgYXJndik7CgogICAgZG91YmxlIGtlayA9IGNvcyhtcGk6OnJhbmsoKSArIDEwLjApOwoKICAgIG1waTo6Y291dCA8PCAiSGVsbG8sIEknbSBtYXN0ZXIgcHJvY2VzcyIgPDwgbXBpOjplbmRsOwogICAgbXBpOjpjb3V0IDw8ICJNaW4ga2VrcyBpcyAiIDw8IG1waTo6bWluKGtlaykgPDwgbXBpOjplbmRsOwoKICAgIG1waTo6ZmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9