QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#245187#7767. 数据结构Crysfly10 4827ms205872kbC++177.1kb2023-11-09 19:40:032023-11-09 19:40:03

Judging History

你现在查看的是最新测评结果

  • [2023-11-09 19:40:03]
  • 评测
  • 测评结果:10
  • 用时:4827ms
  • 内存:205872kb
  • [2023-11-09 19:40:03]
  • 提交

answer

// what is matter? never mind. 
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") 
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
//#define int long long
#define ull unsigned long long
using namespace std;
inline ll read()
{
    char c=getchar();ll x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}

#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
 
#define maxn 400005
#define inf 0x3f3f3f3f

mt19937_64 rng(114);

int n;

struct dat{
	ull c,s;
	dat(ull x=0,ull y=0){c=x,s=y;}
	void add(ull x){
		s+=c*x;
	}
};
dat operator +(dat a,dat b){
	return dat(a.c+b.c,a.s+b.s);
}
dat operator -(dat a,dat b){
	return dat(a.c-b.c,a.s-b.s);
}

struct node{
	dat s0,s[4];
	node(){
		s0=0;
		For(i,0,3)s[i]=0;
	}
};
node operator +(node a,node b){
	node c;
	c.s0=a.s0+b.s0;
	For(i,0,3)c.s[i]=a.s[i]+b.s[i];
	return c;
}
//void operator +=(node&a,node b){
//	a=a+b;
//}

struct oper{
	ull t0,t[4];
	oper(){
		t0=0;
		For(i,0,3)t[i]=0;
	}
	bool emp(){
		For(i,0,3)if(t[i])return 0;
		if(t0)return 0;
		return 1;
	}
};
oper operator +(oper a,oper b){
	oper c;
	c.t0=a.t0+b.t0;
	For(i,0,3)c.t[i]=a.t[i]+b.t[i];
	return c;
}
node operator +(node a,oper b){
	a.s0.add(b.t0);
	For(i,0,3){
		a.s[i].add(b.t0);
		if(b.t[i])a.s0.s+=a.s[i].c*b.t[i],a.s[i].add(b.t[i]);
	}
	return a;
}

oper mov(oper a){
	For(i,0,2)a.t[i]=a.t[i+1];
	a.t[3]=0;
	return a;
}
node movup(node a){
	Rep(i,3,1)a.s[i]=a.s[i-1]; a.s[0]=0;
	return a;
}

namespace T{
	int rt[maxn],ls[maxn],rs[maxn];
	node v[maxn],s[maxn];
	oper tag[maxn],tag2[maxn];
	unsigned rnd[maxn];
	void up(int x){
		s[x]=s[ls[x]]+v[x]+s[rs[x]];
	}
	void pt(int x,oper y){
		if(!x)return;
		tag[x]=tag[x]+y;
		tag2[x]=tag2[x]+y;
		v[x]=v[x]+y;
		s[x]=s[x]+y;
	}
	void down(int x){
		if(!x || tag[x].emp())return;
		pt(ls[x],tag[x]),pt(rs[x],tag[x]),tag[x]=oper();
	}
	void split(int p,int k,int&x,int&y){
		if(!p)return x=y=0,void();
		down(p);
		if(p<=k)x=p,split(rs[p],k,rs[p],y);
		else y=p,split(ls[p],k,x,ls[p]); up(p); 
	}
	void split(int p,int k,int&x,int&y,int&z){
		int t;
		split(p,k-1,x,t);
		split(t,k,y,z);
	}
	int merge(int x,int y){
		if(!x||!y)return x|y;
		down(x),down(y);
		if(rnd[x]<rnd[y])return rs[x]=merge(rs[x],y),up(x),x;
		return ls[y]=merge(x,ls[y]),up(y),y;
	}
};

#define ls(x) ch[x][0]
#define rs(x) ch[x][1]
int fa[maxn],ch[maxn][2];
oper tag[maxn];
node v[maxn],s[maxn];
bool rev[maxn];

bool chk(int x){return rs(fa[x])==x;}
bool nrt(int x){return ls(fa[x])==x||rs(fa[x])==x;}
void up(int x){
	s[x]=s[ls(x)]+v[x]+s[rs(x)]+movup(T::s[T::rt[x]]);
}
void pr(int x){
	rev[x]^=1;
	swap(ls(x),rs(x));
}
void update(int u,ull x){
//	if(x)cerr<<"update "<<u<<" "<<x<<"\n";
	oper t;
	t.t[0]=x;
	v[u]=v[u]+t;
}

void pt(int x,oper y){
	if(!x || y.emp())return;
	assert(x);
	tag[x]=tag[x]+y;
	
//	cout<<"pushtag "<<x<<"\n";
//	For(i,0,3)cout<<y.t[i]<<" "; cout<<"\n";
	update(x,y.t0+y.t[0]);
	
	s[x]=s[x]+y;
	T::pt(T::rt[x],mov(y));
}

void down(int x){
	if(rev[x]){
		if(ls(x))pr(ls(x));
		if(rs(x))pr(rs(x));
		rev[x]=0;
	}
	if(!tag[x].emp()){
		if(ls(x))pt(ls(x),tag[x]);
		if(rs(x))pt(rs(x),tag[x]);
		tag[x]=oper();
	}
}

void downall(int p){
	if(nrt(p))downall(fa[p]);
	down(p);
}
void rot(int x){
	int y=fa[x],z=fa[y],k=chk(x),s=ch[x][!k];
	fa[x]=z; if(nrt(y)) ch[z][chk(y)]=x;
	fa[y]=x; ch[x][!k]=y;
	if(s)fa[s]=y; ch[y][k]=s; up(y),up(x);
}
void splay(int x){
	if(!x)return;
	downall(x);
	while(nrt(x)){
		int y=fa[x];
		if(nrt(y))rot(chk(x)==chk(y)?y:x);
		rot(x);
	}
}
int findL(int x){
	down(x);
	while(ls(x))down(x=ls(x));
	return splay(x),x;
}

int st[maxn],tp;

void ins(int x,int y){
//	cout<<"ins "<<x<<" "<<y<<"\n";
	
	y=findL(y);
	int a,b;
	T::split(T::rt[x],y,a,b);
//	T::v[y]=T::s[y]=[y]; // wrong.

	node tmp;
	tmp.s0=s[y].s0;
	int z=y;
	For(i,0,2){
		tmp.s[i]=tmp.s[i]+v[z].s[0];
		For(j,0,1-i) tmp.s[i+j+1]=tmp.s[i+j+1]+T::s[T::rt[z]].s[j];
		if(i==2 || !rs(z))break;
		z=findL(rs(z)),splay(z);
	}
	
//	cout<<"tmp:\n";
//	For(i,0,3)cout<<tmp.s[i].s<<" ";puts("");
	
	splay(y);
	T::v[y]=T::s[y]=tmp;
	T::tag[y]=T::tag2[y]=oper();
	T::rt[x]=T::merge(T::merge(a,y),b);
}
void del(int x,int y){
//	cout<<"del "<<x<<" "<<y<<"\n";
	
	int a,b,c;
	y=findL(y),splay(y);
	T::split(T::rt[x],y,a,b,c);
	assert(b==y);
	
	oper tmp=T::tag2[y];
	
//	For(i,0,3) cout<<tmp.t[i]<<" "; cout<<"val_y\n";
	
	oper tt; tt.t0=tmp.t0;
	pt(y,tt); tt.t0=0;
	
	int z=y;
	For(i,0,2){
		For(j,0,2-i) tt.t[j]=tmp.t[i+j];
		T::pt(T::rt[z],mov(tt));
		//v[z]
		
	//	oper tt0; tt0.t[0]=tmp.t[i];
		update(z,tmp.t[i]);
		
		up(z);
		if(i==2 || !rs(z))break;
		z=findL(rs(z)),splay(z);
	}
	
	splay(y);
	T::rt[x]=T::merge(a,c);
}
void make(int x,int y){
//	cout<<"mak "<<x<<" "<<y<<"\n";
    if(rs(x)){
    	int tmp=rs(x); rs(x)=0;
    	ins(x,tmp);
    }
    splay(y);
  //  cout<<"mk "<<x<<" "<<y<<"\n";
    if(y){
    	del(x,y);
    	splay(y);
    }
    rs(x)=y;
    up(x);
}
void acc(int x){
//	cout<<"acc "<<x<<"\n";
    tp=0;
    for(int y=0;x;x=fa[y=x]) splay(x),st[++tp]=x;
 //   For(i,1,tp) cout<<st[i]<<" "; cout<<"\n";
    Rep(i,tp,1){
        splay(st[i]);
        make(st[i],st[i-1]);
    }
 //   cout<<"done\n";
}
void mkrt(int x){acc(x),splay(x),pr(x);}
void split(int x,int y){
	mkrt(x),acc(y),splay(y);
}

void dfs(int u){
	if(!u)return;
	down(u);
	if(ls(u))dfs(ls(u));
	cout<<u<<" ";
	if(rs(u))dfs(rs(u));
}

vi e[maxn];
void dfs(int u,int pa){
	for(int v:e[u])
		if(v!=pa){
			fa[v]=u;
			dfs(v,u),ins(u,v);
		}
	up(u);
}
int m;
signed main()
{
//	freopen("3.in","r",stdin);
//	freopen("my.out","w",stdout);
	n=read(),m=read();
	For(i,2,n){
		int u=read(),v=read();
		e[u].pb(v),e[v].pb(u);
	}
	For(i,1,n)T::rnd[i]=rng(),v[i].s0.c=v[i].s[0].c=1;
	dfs(1,0);
	
//	For(i,1,n)cout<<fa[i]<<" ";cout<<" fa\n";
	For(_,1,m){
		int op=read(),u,v,k,x;
		if(op==1){
			u=read(),v=read(),k=read(),x=read();
			oper t;
			For(i,0,k) t.t[i]=x;
			split(u,v);
	//		dfs(v);cout<<" ---\n";
		//	cout<<"pushtag "<<(t.emp())<<"\n";
			pt(v,t);
		}
		if(op==2){
			u=read(),x=read();
			mkrt(1);
			acc(u),splay(u);
			oper t; t.t0=x;
			update(u,x);
			T::pt(T::rt[u],t);
			up(u);
		}
		if(op==3){
			u=read(),v=read(),k=read();
			split(u,v);
			ull res=0;
			For(i,0,k)res+=s[v].s[i].s;
			cout<<res<<"\n";
		}
		if(op==4){
			u=read();
			mkrt(1);
			acc(u),splay(u);
			ull res=0;
			res+=::v[u].s[0].s;
			res+=T::s[T::rt[u]].s0.s;
			cout<<res<<"\n";
		}
		
//		For(i,1,n){
//			cout<<"ASK "<<i<<"\n";
//			split(i,i);
//			cout<<"i: "<<i<<" "<<::v[i].s0.s<<" "<<::v[i].s0.c<<" "<<s[i].s0.s<<" "<<s[i].s0.c<<"\n";
//		}
//		cout<<"\n";
	}
	return 0;
}
/*
8 6
1 2
1 3
2 4
2 5
2 8
4 6
4 7

1 6 8 0 1
1 6 8 1 1
*/

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 75ms
memory: 193268kb

input:

5000 5000
1 2
2 3
3 4
4 5
5 6
5 7
6 8
7 9
9 10
8 11
11 12
12 13
12 14
14 15
15 16
16 17
16 18
18 19
18 20
20 21
20 22
22 23
23 24
23 25
23 26
26 27
27 28
28 29
27 30
30 31
29 32
32 33
33 34
32 35
35 36
36 37
35 38
36 39
38 40
38 41
41 42
42 43
43 44
42 45
44 46
45 47
47 48
48 49
48 50
49 51
51 52
52...

output:

37227703492
2136305359188
2794367845468
1309925069860
1698169768858
2678958746332
6690595071246
2087921985193
5786428171404
2186592622
4014965079076
1674542130
6524658548
7094460247686
10067235442423
11591333131659
492570862
3357440754420
2834694279
4198036633070
4395772262
4221137767
9630829210
992...

result:

wrong answer 8th numbers differ - expected: '2087826052960', found: '2087921985193'

Subtask #2:

score: 0
Time Limit Exceeded

Test #3:

score: 10
Accepted
time: 4827ms
memory: 200944kb

input:

200000 200000
1 2
1 3
1 4
3 5
1 6
1 7
7 8
8 9
2 10
1 11
5 12
1 13
7 14
10 15
2 16
7 17
11 18
5 19
5 20
1 21
16 22
1 23
3 24
20 25
14 26
2 27
6 28
15 29
10 30
15 31
5 32
13 33
12 34
31 35
31 36
36 37
36 38
1 39
28 40
5 41
12 42
41 43
20 44
30 45
22 46
11 47
47 48
45 49
14 50
41 51
3 52
30 53
29 54
6 ...

output:

0
0
0
0
0
0
0
0
7615073807
4176911055
0
4745654848
6222845818
0
0
9739142819
0
1424960716
5224818790
9459319003
13717923473
8673060864
0
11610197664
0
0
9587792729
0
0
0
2747489046
12425650803
0
0
11191496476
0
37597503993
0
0
15164651949
14868775382
15559673116
0
16391028892
0
15726757336
0
2421390...

result:

ok 100169 numbers

Test #4:

score: -10
Time Limit Exceeded

input:

200000 200000
121679 2
13340 3
45206 4
112138 5
47397 6
88216 7
173469 8
109861 9
58662 10
130056 11
61155 12
4313 13
196310 14
46189 15
32349 16
143798 17
103215 18
159921 19
27365 20
14332 21
49504 22
64451 23
106931 24
59878 25
177587 26
100555 27
86848 28
793 29
79845 30
150813 31
42854 32
11551...

output:

77900221111
0
0
476439705914
0
216029652830
0
0
631267909751
508097390689
0
29277716182
695169620128
0
809294022024
0
0
829507748883
260130797154
0
1005527232590
109198360548
821333235719
0
0
1265757368752
738460021055
296232170804
845184728833
0
434366813420
0
1922343637889
0
0
0
229703081048
0
441...

result:


Subtask #3:

score: 0
Wrong Answer

Test #5:

score: 0
Wrong Answer
time: 4124ms
memory: 205872kb

input:

200000 200000
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
18 19
19 20
20 21
21 22
22 23
23 24
24 25
25 26
26 27
27 28
28 29
29 30
30 31
31 32
32 33
33 34
34 35
35 36
36 37
37 38
38 39
39 40
40 41
41 42
42 43
43 44
44 45
45 46
46 47
47 48
48 49
49 50
50 51
51 ...

output:

0
134315201201061
38210069287857
75889674481730
25202765567748
179527420359031
75824479907233
156951577189979
246509811214535
251383387317167
181645886595511
285463150681348
213797241401335
244909583142805
53376921005282
451665818220
379334117147250
720759810155057
768646965102274
224741692238593
18...

result:

wrong answer 4515th numbers differ - expected: '889412497609724', found: '889412763938566'

Subtask #4:

score: 10
Accepted

Test #7:

score: 10
Accepted
time: 3768ms
memory: 200852kb

input:

200000 200000
1 2
2 3
3 4
1 5
3 6
5 7
5 8
7 9
2 10
7 11
11 12
10 13
6 14
3 15
14 16
4 17
11 18
3 19
14 20
4 21
4 22
12 23
18 24
5 25
5 26
14 27
13 28
24 29
11 30
26 31
29 32
28 33
31 34
23 35
33 36
6 37
11 38
22 39
13 40
35 41
37 42
21 43
12 44
4 45
16 46
12 47
21 48
1 49
26 50
45 51
41 52
46 53
7 5...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 99786 numbers

Test #8:

score: 0
Accepted
time: 2984ms
memory: 202516kb

input:

200000 200000
1 2
2 3
1 4
1 5
2 6
3 7
6 8
8 9
8 10
9 11
8 12
12 13
13 14
11 15
13 16
13 17
16 18
17 19
18 20
19 21
19 22
21 23
21 24
21 25
24 26
23 27
26 28
27 29
26 30
30 31
28 32
29 33
32 34
32 35
33 36
36 37
35 38
38 39
38 40
40 41
39 42
42 43
43 44
41 45
45 46
43 47
45 48
46 49
49 50
50 51
51 52...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 100404 numbers

Test #9:

score: 0
Accepted
time: 4604ms
memory: 202336kb

input:

200000 200000
166945 2
60190 3
101888 4
154621 5
188595 6
175999 7
140051 8
54071 9
167394 10
54228 11
48270 12
14564 13
25727 14
138072 15
77670 16
77795 17
155644 18
171648 19
94412 20
65323 21
130225 22
6359 23
17410 24
8580 25
142556 26
152863 27
166869 28
115234 29
87099 30
160349 31
98200 32
1...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 99768 numbers

Subtask #5:

score: 0
Wrong Answer

Dependency #4:

100%
Accepted

Test #10:

score: 0
Wrong Answer
time: 3762ms
memory: 200780kb

input:

200000 200000
1 2
1 3
2 4
1 5
2 6
2 7
2 8
5 9
3 10
10 11
5 12
4 13
5 14
9 15
11 16
14 17
12 18
13 19
2 20
16 21
3 22
16 23
2 24
7 25
8 26
20 27
21 28
11 29
12 30
4 31
2 32
21 33
14 34
29 35
16 36
21 37
28 38
22 39
27 40
12 41
36 42
32 43
30 44
3 45
43 46
4 47
14 48
44 49
9 50
37 51
20 52
11 53
31 54...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
457266854
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

wrong answer 134th numbers differ - expected: '0', found: '457266854'

Subtask #6:

score: 0
Skipped

Dependency #4:

100%
Accepted

Dependency #5:

0%

Subtask #7:

score: 0
Skipped

Dependency #2:

0%

Subtask #8:

score: 0
Skipped

Dependency #1:

0%