#include <assert.h>
#include <map>
#include<iostream>
#include <limits>
using namespace std;
template < class K, class V>
class interval_map {
friend void IntervalMapTest( ) ;
private :
std:: map < K,V> m_map;
public :
// constructor associates whole range of K with val by inserting (K_min, val)
// into the map
void print_map( )
{
typedef typename std:: map < K,V> :: iterator MapIterator;
for ( MapIterator itr = m_map.begin ( ) ; itr ! = m_map.end ( ) ; ++ itr)
std:: cout << itr- > first << ':' << itr- > second << '\n ' ;
std:: cout << std:: endl ;
}
interval_map( V const & val) {
m_map.insert ( m_map.begin ( ) ,std:: make_pair ( std:: numeric_limits < unsigned int > :: min ( ) ,val) ) ;
} ;
// Assign value val to interval [keyBegin, keyEnd).
// Overwrite previous values in this interval.
// Do not change values outside this interval.
// Conforming to the C++ Standard Library conventions, the interval
// includes keyBegin, but excludes keyEnd.
// If !( keyBegin < keyEnd ), this designates an empty interval,
// and assign must do nothing.
void assign( K const & keyBegin, K const & keyEnd, const V& val ) {
// INSERT YOUR SOLUTION HERE
// On encountering empty interval, assign must do nothing
typedef typename std:: map < K,V> :: iterator MapIterator;
MapIterator it = m_map.find ( keyEnd) ;
if ( it == m_map.end ( ) && it- > second == val)
return ;
for ( K kitr= keyBegin; kitr< keyEnd; kitr++ )
{
auto ret = m_map.insert ( make_pair( kitr, val) ) ;
if ( ! ret.second ) {
m_map[ kitr] = val;
}
}
}
// look-up of the value associated with key
V const & operator[ ] ( K const & key ) const {
return ( -- m_map.upper_bound ( key) ) - > second;
}
} ;
// Many solutions we receive are incorrect. Consider using a randomized test
// to discover the cases that your implementation does not handle correctly.
// We recommend to implement a function IntervalMapTest() here that tests the
// functionality of the interval_map, for example using a map of unsigned int
// intervals to char.
void IntervalMapTest( ) {
interval_map< unsigned int ,char > test_map( 'a' ) ;
//test corner cases
test_map.assign ( 1 , 4 , 'b' ) ;
test_map.print_map ( ) ;
test_map.assign ( 2 , 3 , 'c' ) ;
test_map.print_map ( ) ;
test_map.assign ( std:: numeric_limits < unsigned int > :: min ( ) , 5 , 'a' ) ;
test_map.print_map ( ) ;
//print_map();
test_map.assign ( 1 , 2 , 'a' ) ;
test_map.print_map ( ) ;
//print_map();
test_map.assign ( 1 , 3 , 'b' ) ;
test_map.print_map ( ) ;
//print_map();
test_map.assign ( 2 , 4 , 'a' ) ;
test_map.print_map ( ) ;
//print_map();
test_map.assign ( 0 , std:: numeric_limits < unsigned int > :: max ( ) + 1 , 'b' ) ;
test_map.print_map ( ) ;
test_map.assign ( - 1 , 0 , 'b' ) ;
test_map.print_map ( ) ;
//print_map();
//test random
test_map.assign ( std:: numeric_limits < unsigned int > :: min ( ) ,
std:: numeric_limits < unsigned int > :: max ( ) , 'a' ) ;
test_map.print_map ( ) ;
// srand (time(NULL));
}
int main( int argc, char * argv[ ] ) {
IntervalMapTest( ) ;
return 0 ;
}
#include <iostream>
using namespace std;
int main( ) {
// your code goes here
return 0 ;
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGUgPGxpbWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjbGFzcyBLLCBjbGFzcyBWPgpjbGFzcyBpbnRlcnZhbF9tYXAgewogICAgZnJpZW5kIHZvaWQgSW50ZXJ2YWxNYXBUZXN0KCk7Cgpwcml2YXRlOgogICAgc3RkOjptYXA8SyxWPiBtX21hcDsKCnB1YmxpYzoKICAgIC8vIGNvbnN0cnVjdG9yIGFzc29jaWF0ZXMgd2hvbGUgcmFuZ2Ugb2YgSyB3aXRoIHZhbCBieSBpbnNlcnRpbmcgKEtfbWluLCB2YWwpCiAgICAvLyBpbnRvIHRoZSBtYXAKICAgIHZvaWQgcHJpbnRfbWFwKCkKICAgIHsKICAgIAkgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1hcDxLLFY+OjppdGVyYXRvciBNYXBJdGVyYXRvcjsKICAgICBmb3IgKE1hcEl0ZXJhdG9yIGl0ciA9IG1fbWFwLmJlZ2luKCk7IGl0ciAhPSBtX21hcC5lbmQoKTsgKytpdHIpCiAgICAgc3RkOjpjb3V0IDw8IGl0ci0+Zmlyc3QgPDwgJzonIDw8IGl0ci0+c2Vjb25kIDw8ICdcbic7CiAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIGludGVydmFsX21hcCggViBjb25zdCYgdmFsKSB7CiAgICAgICAgbV9tYXAuaW5zZXJ0KG1fbWFwLmJlZ2luKCksc3RkOjptYWtlX3BhaXIoc3RkOjpudW1lcmljX2xpbWl0czx1bnNpZ25lZCBpbnQ+OjptaW4oKSx2YWwpKTsKICAgIH07CgogICAgLy8gQXNzaWduIHZhbHVlIHZhbCB0byBpbnRlcnZhbCBba2V5QmVnaW4sIGtleUVuZCkuCiAgICAvLyBPdmVyd3JpdGUgcHJldmlvdXMgdmFsdWVzIGluIHRoaXMgaW50ZXJ2YWwuCiAgICAvLyBEbyBub3QgY2hhbmdlIHZhbHVlcyBvdXRzaWRlIHRoaXMgaW50ZXJ2YWwuCiAgICAvLyBDb25mb3JtaW5nIHRvIHRoZSBDKysgU3RhbmRhcmQgTGlicmFyeSBjb252ZW50aW9ucywgdGhlIGludGVydmFsCiAgICAvLyBpbmNsdWRlcyBrZXlCZWdpbiwgYnV0IGV4Y2x1ZGVzIGtleUVuZC4KICAgIC8vIElmICEoIGtleUJlZ2luIDwga2V5RW5kICksIHRoaXMgZGVzaWduYXRlcyBhbiBlbXB0eSBpbnRlcnZhbCwKICAgIC8vIGFuZCBhc3NpZ24gbXVzdCBkbyBub3RoaW5nLgogICAgdm9pZCBhc3NpZ24oIEsgY29uc3QmIGtleUJlZ2luLCBLIGNvbnN0JiBrZXlFbmQsIGNvbnN0IFYmIHZhbCApIHsKLy8gSU5TRVJUIFlPVVIgU09MVVRJT04gSEVSRQogICAgIC8vIE9uIGVuY291bnRlcmluZyBlbXB0eSBpbnRlcnZhbCwgYXNzaWduIG11c3QgZG8gbm90aGluZwogICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1hcDxLLFY+OjppdGVyYXRvciBNYXBJdGVyYXRvcjsKICAgICAgIE1hcEl0ZXJhdG9yIGl0ID0gbV9tYXAuZmluZChrZXlFbmQpOwogICAgICAgaWYgKGl0ID09IG1fbWFwLmVuZCgpICYmIGl0LT5zZWNvbmQgPT0gdmFsKQogICAgICAgcmV0dXJuOwpmb3IoSyBraXRyPWtleUJlZ2luO2tpdHI8a2V5RW5kO2tpdHIrKykKewogYXV0byByZXQgPSBtX21hcC5pbnNlcnQobWFrZV9wYWlyKGtpdHIsIHZhbCkpOwogICAgaWYgKCFyZXQuc2Vjb25kKXsKICAgICAgICBtX21hcFtraXRyXSA9IHZhbDsKICAgIH0KfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAvLyBsb29rLXVwIG9mIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgga2V5CiAgICBWIGNvbnN0JiBvcGVyYXRvcltdKCBLIGNvbnN0JiBrZXkgKSBjb25zdCB7CiAgICAgICAgcmV0dXJuICggLS1tX21hcC51cHBlcl9ib3VuZChrZXkpICktPnNlY29uZDsKICAgIH0KfTsKCi8vIE1hbnkgc29sdXRpb25zIHdlIHJlY2VpdmUgYXJlIGluY29ycmVjdC4gQ29uc2lkZXIgdXNpbmcgYSByYW5kb21pemVkIHRlc3QKLy8gdG8gZGlzY292ZXIgdGhlIGNhc2VzIHRoYXQgeW91ciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYW5kbGUgY29ycmVjdGx5LgovLyBXZSByZWNvbW1lbmQgdG8gaW1wbGVtZW50IGEgZnVuY3Rpb24gSW50ZXJ2YWxNYXBUZXN0KCkgaGVyZSB0aGF0IHRlc3RzIHRoZQovLyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBpbnRlcnZhbF9tYXAsIGZvciBleGFtcGxlIHVzaW5nIGEgbWFwIG9mIHVuc2lnbmVkIGludAovLyBpbnRlcnZhbHMgdG8gY2hhci4KCnZvaWQgSW50ZXJ2YWxNYXBUZXN0KCkgewogICAgaW50ZXJ2YWxfbWFwPHVuc2lnbmVkIGludCxjaGFyPiB0ZXN0X21hcCgnYScpOwogICAgLy90ZXN0IGNvcm5lciBjYXNlcwogICAgdGVzdF9tYXAuYXNzaWduKDEsIDQsICdiJyk7CiAgICB0ZXN0X21hcC5wcmludF9tYXAoKTsKICAgIHRlc3RfbWFwLmFzc2lnbigyLCAzLCAnYycpOwogICB0ZXN0X21hcC5wcmludF9tYXAoKTsKICAgIHRlc3RfbWFwLmFzc2lnbihzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1pbigpLCA1LCAnYScpOwogICAgdGVzdF9tYXAucHJpbnRfbWFwKCk7CiAgICAvL3ByaW50X21hcCgpOwogICAgdGVzdF9tYXAuYXNzaWduKDEsIDIsICdhJyk7CiAgICB0ZXN0X21hcC5wcmludF9tYXAoKTsKICAgIC8vcHJpbnRfbWFwKCk7CiAgICB0ZXN0X21hcC5hc3NpZ24oMSwgMywgJ2InKTsKICAgIHRlc3RfbWFwLnByaW50X21hcCgpOwogICAgLy9wcmludF9tYXAoKTsKICAgIHRlc3RfbWFwLmFzc2lnbigyLCA0LCAnYScpOwogICAgdGVzdF9tYXAucHJpbnRfbWFwKCk7CiAgICAvL3ByaW50X21hcCgpOwogICAgdGVzdF9tYXAuYXNzaWduKDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkgKyAxLCAnYicpOwogICAgdGVzdF9tYXAucHJpbnRfbWFwKCk7CiAgICB0ZXN0X21hcC5hc3NpZ24oLTEsIDAsICdiJyk7CiAgICB0ZXN0X21hcC5wcmludF9tYXAoKTsKICAgIC8vcHJpbnRfbWFwKCk7CgogICAgLy90ZXN0IHJhbmRvbQogICAgdGVzdF9tYXAuYXNzaWduKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWluKCksCiAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCksICdhJyk7CnRlc3RfbWFwLnByaW50X21hcCgpOwogIC8vICBzcmFuZCAodGltZShOVUxMKSk7CgoKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewoKICAgIEludGVydmFsTWFwVGVzdCgpOwogICAgcmV0dXJuIDA7Cn0KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==