1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
   | #include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 5; struct Tree { 	#define lson (x << 1) 	#define rson (x << 1) + 1 	int presum_Max[MAXN << 2], sufsum_Max[MAXN << 2], Max[MAXN << 2]; 	int presum_Min[MAXN << 2], sufsum_Min[MAXN << 2], Min[MAXN << 2]; 	int sum[MAXN << 2], Min_val[MAXN << 2], rt; 	 	inline void pushup (int x) { 		presum_Max[x] = max (presum_Max[lson], sum[lson] + presum_Max[rson]); 		sufsum_Max[x] = max (sufsum_Max[rson], sufsum_Max[lson] + sum[rson]); 		presum_Min[x] = min (presum_Min[lson], sum[lson] + presum_Min[rson]); 		sufsum_Min[x] = min (sufsum_Min[rson], sufsum_Min[lson] + sum[rson]); 		sum[x] = sum[lson] + sum[rson]; 		Max[x] = max (Max[lson], Max[rson]); 		Max[x] = max (Max[x], sufsum_Max[lson] + presum_Max[rson]); 		Min[x] = min (Min[lson], Min[rson]); 		Min[x] = min (Min[x], sufsum_Min[lson] + presum_Min[rson]); 		Min_val[x] = min (Min_val[lson], Min_val[rson]); 		return; 	} 	void insert (int x, int l, int r) { 		if (l == r) { 			scanf ("%d", &sum[x]); 			presum_Max[x] = sum[x]; 			sufsum_Max[x] = sum[x]; 			presum_Min[x] = sum[x]; 			sufsum_Min[x] = sum[x]; 			Max[x] = sum[x]; 			Min[x] = sum[x]; 			Min_val[x] = sum[x]; 			return; 		} 		int mid = (l + r) >> 1; 		insert (lson, l, mid); 		insert (rson, mid + 1, r); 		pushup(x); 		return; 	} 	void change (int x, int l, int r, int k, int val) { 		if (l == r) { 			sum[x] = val; 			presum_Max[x] = val; 			sufsum_Max[x] = val; 			presum_Min[x] = val; 			sufsum_Min[x] = val; 			Max[x] = val; 			Min[x] = val; 			Min_val[x] = val; 			return; 		} 		int mid = (l + r) >> 1; 		if (k > mid) { 			change (rson, mid + 1, r, k, val); 		} 		else { 			change (lson, l, mid, k, val); 		} 		pushup(x); 		return; 	} }; Tree T; int n, m; int main() { 	scanf ("%d", &n); 	T.rt = 1; 	T.insert (T.rt, 1, n); 	scanf ("%d", &m); 	for (int i = 1; i <= m; i++) { 		int k, val; 		scanf ("%d%d", &k, &val); 		T.change (T.rt, 1, n, k, val); 		int temp; 		if (T.sum[T.rt] != T.Max[T.rt]) { 			temp = T.Max[T.rt]; 		} 		else { 			temp = T.sum[T.rt] - T.Min_val[T.rt]; 		} 		printf ("%d\n", max (temp, T.sum[T.rt] - T.Min[T.rt])); 	} 	return 0; }
   |