// set-ын талаар үзэх болно.
#include <set> // set-ын функцууд агуулдаг сан
#include <iostream>
using namespace std;

int main() {
	/*
		set гэдэг нь элемэнтүүдийн эрэмбэлж халгалдаг зүйл юм.
		мөн давхардлыг арилгадаг. элемэнт нэмэх мөн устгахад
		LogN үйлдэл шаарддаг ба N нь set байгаа элемэнтийн тоо юм.
		энэ нь цаанаа өөр зүйл ашигладаг(2тын мод) тул бид 3р 
		элемэнтийн утганд шууд хандаж чадахгүй. Харин map-ын 
		адил iterator ашигладаг.
	*/
	set<int> s; // int төрлийн утга авлаг set анх хоосон байгаа
	set<int>::iterator it; // int төрлийн утга авдаг set-ын заагч

	s.insert( 222 ); // set-д элемэнт нэмэх
	s.insert( 111 ); // set-д элемэнт нэмэх

	for( it = s.begin(); it != s.end(); it++) {
		// set-д байгаа бүх элемэнтийг хэвлэж байна
		cout << *it << " ";
		// it-нь заагч тул бид элемэнтийг утгыг хэвлэхийн тул *
		// тавьж мэднэ
	}

	cout << "\n----------------------------------\n";
	
	int n = s.size(); // одоо байгаа элемэнтийн хэмжээ
	cout << n << endl;

	cout << "----------------------------------\n";

	s.insert( 111 ); // энэ элемэнт байгаа тул хэмжээ өөрчлөгдөхгүй
	n = s.size();
	cout << n << endl;
	cout << "----------------------------------\n";

	s.insert( 22 );
	s.insert( 12 );
	
	for( it = s.begin(); it != s.end(); it++) {
		// set-д байгаа бүх элемэнтийг хэвлэж байна
		cout << *it << " ";
		// it-нь заагч тул бид элемэнтийг утгыг хэвлэхийн тул *
		// тавьж мэднэ
	}
	cout << "\n----------------------------------\n";

	s.erase( 22 );	// 22 гэсэн элемэнтийг устгаж байна
					// хэрвээ байхгүй бол юуг ч устгахгүй
	for( it = s.begin(); it != s.end(); it++) {
		// set-д байгаа бүх элемэнтийг хэвлэж байна
		cout << *it << " ";
		// it-нь заагч тул бид элемэнтийг утгыг хэвлэхийн тул *
		// тавьж мэднэ
	}
	cout << "\n----------------------------------\n";

	it = s.lower_bound( 12 );// 12-оос их буюу тэнцүү хамгийн бага
							// элемэнтийн байрлалыг буцаана. Хэрвээ
							// бүх элемэнт 12 бага бол size буюу
							// төгсгөлийн буцаана.
	cout << *it << "\n----------------------------------\n";

	it = s.upper_bound( 12 ); // 12-оос эрс их  хамгийн бага
							// элемэнтийн байрлалын буцаана. Хэрвээ
							// бүх элемэнт 12 бага бол size буюу
							// төгсгөлийн буцаана.
	cout << *it << "\n----------------------------------\n";

	s.erase( it ); // it-ын зааж байгаа элемэнтийг устгана.
	for( it = s.begin(); it != s.end(); it++) {
		// set-д байгаа бүх элемэнтийг хэвлэж байна
		cout << *it << " ";
		// it-нь заагч тул бид элемэнтийг утгыг хэвлэхийн тул *
		// тавьж мэднэ
	}
	cout << "\n----------------------------------\n";
	return 0;
}