T107741] [template tree line weights merger

Topics address


#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN=1e6;
struct Node{
	int ls,rs;
	int val,pos;
} P [MAXN * 20 * 4];
int nodeCnt=0;
void insert(int &p,int l,int r,int x,int val){
	if(!p)p=++nodeCnt;
	if(l==r){
		tr[p].val+=val;
		tr[p].pos=l;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)insert(tr[p].ls,l,mid,x,val);
	else if(x>mid)insert(tr[p].rs,mid+1,r,x,val);
	tr[p].val=max(tr[tr[p].ls].val,tr[tr[p].rs].val);
	p [p] = p .pos [p [p] .ls] .val> = p [p [p] .RS] .val? p [p [p] .ls] .pos: p [p [p] .RS] .pos;
}
int merge (int p, int g, int l, int r) {
	if(!p)return q;
	if(!q)return p;
	if(l==r){
		tr[p].val+=tr[q].val;
		tr[p].pos=tr[p].val?l:0;
		return p;
	}
	int mid=(l+r)>>1;
	tr [p] .ls = go (tr [p] .ls, tr [q] .ls, l, mid);
	tr[p].rs=merge(tr[p].rs,tr[q].rs,mid+1,r);
	tr[p].val=max(tr[tr[p].ls].val,tr[tr[p].rs].val);
	p [p] = p .pos [p [p] .ls] .val> = p [p [p] .RS] .val? p [p [p] .ls] .pos: p [p [p] .RS] .pos;
	return p;
}
int roots[MAXN],rootCnt=0;
int main () {
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int opt;
		cin>>opt;
		if (opt == 1) {// new segment tree 
			roots[++rootCnt]=++nodeCnt;
		} Else if (opt == 2) {// added to the value of a segment tree trees 
			int nowRoot,x,num;
			scanf("%d%d%d",&nowRoot,&x,&num);
			insert(roots[nowRoot],1,MAXN,x,num);
		} Else if (opt == 3) {// query a segment tree trees appear the most is which value 
			int nowRoot;
			scanf("%d",&nowRoot);
			cout<<tr[roots[nowRoot]].pos<<endl;
		} Else if (opt == 4) {// merge two segment tree 
			int root1,root2;
			scanf("%d%d",&root1,&root2);
			roots[++rootCnt]=merge(root1,root2,1,MAXN);
		}
	}
	return 0;
}

Guess you like

Origin www.cnblogs.com/zbsy-wwx/p/11811236.html