#pragma once
// 区間に値を対応づける// range set point get + enumeratetemplate<classT>structRangeArray{private:intn;set<int>s;vector<T>data;Te;public:RangeArray(intsize,Te):n(size),e(e){s.insert(0);s.insert(n);data=vector<T>(n,e);}Tget(intx){autoit=s.lower_bound(x+1);it--;returndata[*it];}vector<pair<int,int>>enumerate_intersect(intl,intr){vector<pair<int,int>>ret;autoit=s.lower_bound(l+1);it--;while(it!=s.end()){intl1=*it;if(r<=l1)break;it++;intr1=*it;ret.push_back({l1,r1});}returnret;}voidset(intl,intr,Tv){for(autoit=s.lower_bound(l);it!=s.end();){intl1=*it;if(r<=l1)break;it++;intr1=*it;it--;it=s.erase(it);if(r<r1){s.insert(r);data[r]=data[l1];break;}}s.insert(l);data[l]=v;}};
#line 2 "data-structure/range-array.hpp"
// 区間に値を対応づける// range set point get + enumeratetemplate<classT>structRangeArray{private:intn;set<int>s;vector<T>data;Te;public:RangeArray(intsize,Te):n(size),e(e){s.insert(0);s.insert(n);data=vector<T>(n,e);}Tget(intx){autoit=s.lower_bound(x+1);it--;returndata[*it];}vector<pair<int,int>>enumerate_intersect(intl,intr){vector<pair<int,int>>ret;autoit=s.lower_bound(l+1);it--;while(it!=s.end()){intl1=*it;if(r<=l1)break;it++;intr1=*it;ret.push_back({l1,r1});}returnret;}voidset(intl,intr,Tv){for(autoit=s.lower_bound(l);it!=s.end();){intl1=*it;if(r<=l1)break;it++;intr1=*it;it--;it=s.erase(it);if(r<r1){s.insert(r);data[r]=data[l1];break;}}s.insert(l);data[l]=v;}};