最近市面出現了一款全新的遊戲,absolute counter online,簡稱aco。asuna跟她的男票kirito也都跑去玩這個了。aco有乙個特殊的戰鬥模式,就是完全反擊模式,在這個模式裡,boss跟小怪會來進攻kirito他們的領地,在他們領地的前面,有n個魔法陣,這些魔法陣排成一條橫線,從左往右第i個魔法陣有初始魔力m[i],這些魔法陣會不停消耗魔力攻擊接近領地的敵人,並且它們要進入領地必須經過魔法陣。而kirito他們不會主動出擊,也不能出去,只有當敵人突破魔法陣時,kirito他才能對敵人進行攻擊。asuna的角色能力是精通各種魔法,在這個模式中,她有一項重要能力,就是修復魔法陣,當乙個魔法陣魔力損耗時,她可以直接將這個魔法陣恢復到原先的狀態,即填充滿魔力。另外,她還有一項技能,就是將擅長二刀流的kirito傳送到任意乙個魔法陣的位置,增加那裡的戰鬥力,kirito的戰鬥力固定為a,並且kirito自己不會跑去別的魔法陣,因為妻管嚴。魔法陣的魔力損耗會實時反饋給asuna,但是她已經來不及去計算了,所以她請了個外援,也就是你,來幫她算下,各個魔法陣的實時戰鬥力。乙個魔法陣的戰鬥力計算很簡單,如果kirito在這個魔法陣,則戰鬥力等於m[i] + a,否則等於m[i]。
你會接收到q次資訊,資訊型別如下,第乙個為資訊編碼,後面根據資訊操作碼型別給出乙個或多個引數:
1、move x,表示把kirito移動到第x個魔法陣。
2、repair x, 表示asuna修復了第x個魔法陣,請注意,這裡只會修復到相應魔法陣的初始魔力,即把魔力修復到m[x]。
3、attack x v,表示第x個魔法陣消耗了v魔力進行了攻擊。
4、query l r,表示查詢第l個魔法陣到第r個魔法陣的戰鬥力總和。
input
第一行輸入乙個t,表示有t組資料。
每組資料,第一行輸入n, a, x,依次為魔法陣數量,kirito的攻擊力以及kirito所在魔法陣編號。
接下來一行有n個數字,依次表示各個魔法陣的初始魔力。
接下來一行,乙個整數q,表示要接收處理的資訊數量。
接著有q行,每行先乙個操作碼,操作碼只有4種(move repair attack query),根據操作碼型別後面跟著乙個或兩個引數,引數個數及意義請參照描述。
資料範圍:
1 <= t <= 20
1 <= n <= 100000
1 <= q <= 200000
1 <= a, m[i] <= 1000000000
對於操作move和repair,1 <= x <= n
對於操作attack,1 <= x <= n,1 <= v <= 當前第x個魔法陣的魔力,即保證魔法陣的魔力不會小於0。
對於操作query,1 <= l <= r <= n。
所有輸入都是正整數。
output
對於第k組資料,先輸出一行「case #k:」,k從1開始計數。
對於query操作,輸出一行表示查詢的對應的戰鬥力總和。
線段樹單點更新版本:
public
class asuna
for (int i = 0; i <= 100005
<< 2; i++)
index = 0;
build(1, 1, n);
out.println("case #" + (cases++) + ":");
int q = reader.nextint();
while (q-- > 0)
out.println(ans);
} else
if (com.equals("attack")) else
if (com.equals("move")) else }}
out.close();
}public
static
void
pushup(int i)
public
static
void
build(int i, int l, int r)
int mid = (l + r) / 2;
build(i << 1, l, mid);
build(i << 1 | 1, mid + 1, r);
pushup(i);
}public
static
void
repair(int i, int l, int r, int l, int r)
int mid = (l + r) / 2;
if (l <= mid)
if (r > mid)
pushup(i);
}public
static
void
attack(int i, int l, int r, int l, int r, int v)
int mid = (l + r) / 2;
if (l <= mid)
if (r > mid)
pushup(i);
}public
static
long
query(int i, int l, int r, int l, int r)
int mid = (l + r) / 2;
long ans = 0;
if (l <= mid)
if (r > mid)
return ans;
}static class node
}
賊長,手動再見。
樹狀陣列版本:
public
class asunabinaryindex
int q = reader.nextint();
while (q-- > 0)
system.out.println(ans);
} else
if (com.charat(0) == 'a') else
if (com.charat(0) == 'm') else }}
}public
static
intlowbit(int i)
public
static
void
update(int i, long val)
}public
static
long
getsum(int i)
return sum;
}}