セグメントツリー
プラグマコメント(リンカ、 "/ STACK:1024000000,1024000000")// HDU 5692
含める
含める
含める
含める
名前空間stdを使用。
MAXN 400010を定義します
INF 1E18を定義します
構造体の再
{
int型のX、Y、RZ。
長い長いZ;
}。
F再[MAXN]。
INT Fiの[MAXN]、NE [MAXN]、U [MAXN]、V [MAXN]。
BOOL VIS [MAXN]。
INT、T = 0、ステップ= 0。
[MAXN] int型。
長い長D [MAXN]。
intデータ[MAXN]。
INT L [MAXN]、R [MAXN]。
長い長いMAX(長い長い、長い長いB)
{
(> b)に戻す場合は、そうでなければ、リターンB。
}
ボイドエッジ(int型のx、int型のY)
{
T ++。
NE [T] = Fiが[X]。
Fiの[X] = T。
U [T] = X。
V [T] = Y。
トン++;
NE [T] = Fiの[Y]。
Fiの[Y] = T。
U [T] = Y。
V [T] = X。
}
ボイドDFS(今INT)
{
ステップ++。
[ステップ]次に=。
L [今] =ステップと
VIS [今] = 1。
以下のために(!; I = - 1; INT iがFiの[今]を= Iは、NE [I]を=)(VIS [V [I]]!)場合
{
INT次= V [i]は、
D [次] + = D [今]。
DFS(次)
}
R [今] =ステップと
リターン;
}
ボイドダウン(int型K)
{
F [K * 2] .rz + = [K] F .rz。
F [K * 2] .Z + = F [K] .rz。
f[k*2+1].rz+=f[k].rz;
f[k*2+1].z+=f[k].rz;
f[k].rz=0;
return;
}
ボイドアップ(int型K)
{
F [k]は.Z = MAX(F [K * 2] .Z、F [K * 2 + 1] .Z)。
リターン;
}
ボイド更新(int型K、int型のL、R INT、INT ZD)
{
IF((F [k]は.X> R)||(F [k]は.Y <L))のリターン;
IF((F [K] .X> = 1)&&(F [K]・Y <= R))
{
F [k]を.rz + = ZD。
F [K] .Z + = ZD。
// int型私はKを=。printf( "%D%D%D%D%LF%D \ n"は、L、R、F [i]が.X、F [i]が.Y、F [i]が.Z、F [i]は.rz );
リターン;
}
down(k);
update(k*2,l,r,zd);
update(k*2+1,l,r,zd);
up(k);
// int型私はKを=。printf( "%D%D%D%D%LF%D \ n"は、L、R、F [i]が.X、F [i]が.Y、F [i]が.Z、F [i]は.rz );
リターン;
}
長い長い問い合わせ(int型K、INT L、int型R)
{
//のprintf( "%D%D%D%D%LLD \ n" は、L、R、F [k]は.X、F [K]・Y、F .Z [K])。
if ((f[k].x>r)||(f[k].y<l)) return -INF;
if ((f[k].x>=l)&&(f[k].y<=r))
{
return f[k].z;
}
down(k);
long long aa=inquiry(k*2,l,r);
long long bb=inquiry(k*2+1,l,r);
return max(aa,bb);
}
ボイドビルド(int型K、INT L、INT R)
{
F [k]は.X = L。
F [K] .Y = R。
IF(L == R)
{
F [k]は.Z = D [L]]。
F [K] .rz = 0。
リターン;
}
INT半ば=(L + R)/ 2。
ビルド(K 2、L、MID)。
ビルド(K 2 + 1、中間+ 1、R)。
アップ(K)。
リターン;
}
INTのmain()
{
int型のターン。
cinを>>回します。
int型加瀬= 0;
一方、(turn--)
{
printf("Case #%d:\n",++kase);
t=0,step=0;
int n,m;
cin>>n>>m;
for (int i=0;i<=n;i++) fi[i]=-1;
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
edge(x,y);
}
for (int i=0;i<n;i++)
{
scanf("%d",&data[i]);
d[i]=data[i];
}
memset(vis,0,sizeof(vis));
dfs(0);
printf( "%D%D%D%D \ n" は、I、L [i]は、R [i]は、D [I]); //(; I <N I ++ INTがI = 0)するため
build(1,1,n);
//ため(INT iが= 1; I <= 15; I ++)のprintf( "%D%D%D%LLD \ n" は、I、F [i]が.X、F [i]が.Y、F [I ] .Z)。
for (int i=1;i<=m;i++)
{
int qwe;
scanf("%d",&qwe);
if (qwe==1)
{
int xx;
scanf("%d",&xx);
printf("%lld\n",inquiry(1,l[xx],r[xx]));
}
else if (qwe==0)
{
int xx,yy;
scanf("%d%d",&xx,&yy);
int delta=yy-data[xx];
data[xx]=yy;
update(1,l[xx],r[xx],delta);
}
}
}
return 0;
}