#include void Compress(std::vector& A) { std::vector B=A;// std::sort(B.begin(),B.end()); B.erase(std::unique(B.begin(),B.end()),B.end()); for(auto& a:A){ a=static_cast(std::lower_bound(B.begin(),B.end(),a)-B.begin()); } } struct Query{ int type; std::string s; int a,b; }; //セグメント木はモノイドの二項演算 // +,*,^,&,| //min,max //gcd //に対応可能 //^とgcdの単位元は0なので注意 using Type=int; Type Op(Type l, Type r) { return (l+r); } Type E() // モノイドの単位元 { return 0; } class SegTree { public: SegTree()=default; SegTree(size_t n) { //葉のサイズは2の累乗 //nを十分格納できるサイズを求める while(m_size& values){ //葉ノードのセット for(size_t i=0;i(m_size)-2;0<=i;--i){//size_tだと-1が大きな数に飛んでしまうのでintに直す update(i); } } //一点更新 void set(size_t i,Type value) { size_t ni = m_size-1+i; m_nodes[ni]=value; while(0 m_nodes; }; int main(){ int n; std::cin >> n; std::map>info; std::vectorroom; for(int i=0;i> s; int a,b; std::cin >> a >> b; info[s]={a,b}; room.push_back(a); room.push_back(b+1); } int q; std::cin >> q; std::vectorquery(q); for(int i=0;i> query[i].type; if(query[i].type==1){ std::cin >> query[i].s >> query[i].a; } else if(query[i].type==2){ std::cin >> query[i].a; } else{ std::cin >> query[i].s >> query[i].a >> query[i].b; room.push_back(query[i].a); room.push_back(query[i].b+1); } } std::vectorori=room; std::sort(ori.begin(),ori.end()); ori.erase(std::unique(ori.begin(),ori.end()),ori.end()); Compress(room); std::vectorsum(room.size()+1); for(int i=0;i