线段树维护哈希
维护两个哈希防被卡
ll v1[N<<2], v2[N<<2], b1[N], b2[N]; void init() { b1[1]=b2[1]=1; REP(i,1,N-1) b1[i]=b1[i-1]*233%P,b2[i]=b2[i-1]*131%P; } void update(int o, int l, int r, int x) { if (l==r) return v1[o]=v2[o]=1,void(); mid>=x?update(ls,x):update(rs,x); v1[o]=(v1[lc]+v1[rc]*b1[mid-l+1])%P; v2[o]=(v2[lc]+v2[rc]*b2[mid-l+1])%P; } void query(int o, int l, int r, int ql, int qr, ull &t1, ull &t2) { if (ql<=l&&r<=qr) { t1 = (t1+v1[o]*b1[l-ql])%P; t2 = (t2+v2[o]*b2[l-ql])%P; return; } if (mid>=ql) query(ls,ql,qr,t1,t2); if (mid<qr) query(rs,ql,qr,t1,t2); } int main(){}