线段树维护哈希

维护两个哈希防被卡

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(){}

 

posted @ 2019-04-11 21:06  uid001  阅读(280)  评论(0编辑  收藏  举报