#pragma once
structMo{usingF=function<void(int)>;intn;vector<int>left,right;Mo(intsize):n(size){}voidadd_query(intl,intr){// [l,r)left.emplace_back(l);right.emplace_back(r);}voidrun(constF&add_left,constF&add_right,constF&del_left,constF&del_right,constF&query){constintq=left.size();if(q==0)return;constintwidth=max(1,(int)(n/sqrt(q)));vector<int>order(q);iota(order.begin(),order.end(),0);sort(order.begin(),order.end(),[&](inti,intj){if(left[i]/width!=left[j]/width)returnleft[i]<left[j];returnright[i]<right[j];});intl=0,r=0;for(inti:order){while(l>left[i])add_left(--l);while(r<right[i])add_right(r++);while(l<left[i])del_left(l++);while(r>right[i])del_right(--r);query(i);}}voidrun(constF&add,constF&del,constF&query){run(add,add,del,del,query);}};