简单的线段树。
记录MinVal 和 相应的ID即可

1 /* 2 线段树 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<map> 11 #include<stack> 12 #include<set> 13 #include<math.h> 14 using namespace std; 15 typedef long long int64; 16 //typedef __int64 int64; 17 typedef pair<int64,int64> PII; 18 #define MP(a,b) make_pair((a),(b)) 19 const int maxn = 10005; 20 const int inf = 0x7fffffff; 21 const double pi=acos(-1.0); 22 const double eps = 1e-8; 23 #define L(x) (x<<1) 24 #define R(x) (x<<1|1) 25 26 struct Tree{ 27 int l,r,id,val; 28 }tree[ maxn<<2 ]; 29 int a[ maxn ]; 30 31 void build( int L,int R,int n ){ 32 tree[ n ].l = L; 33 tree[ n ].r = R; 34 if( L==R ){ 35 tree[ n ].id = L; 36 tree[ n ].val = a[ L ]; 37 return ; 38 } 39 //tree[ n ].val = 0; 40 int mid = (L+R)/2; 41 build( L,mid,L(n) ); 42 build( mid+1,R,R(n) ); 43 if( tree[ L(n) ].val<tree[ R(n) ].val ) { 44 tree[ n ].val = tree[ L(n) ].val; 45 tree[ n ].id = tree[ L(n) ].id; 46 } 47 else if( tree[ L(n) ].val==tree[ R(n) ].val ){ 48 if( tree[L(n)].id<tree[R(n)].id ){ 49 tree[ n ].val = tree[ L(n) ].val; 50 tree[ n ].id = tree[ L(n) ].id; 51 } 52 else { 53 tree[ n ].val = tree[ R(n) ].val; 54 tree[ n ].id = tree[ R(n) ].id; 55 } 56 } 57 else { 58 tree[ n ].val = tree[ R(n) ].val; 59 tree[ n ].id = tree[ R(n) ].id; 60 } 61 } 62 63 void update1( int val,int L,int R,int n ){ 64 if( L==R ){ 65 tree[ n ].val += val; 66 return ; 67 } 68 int mid = (L+R)/2; 69 if( tree[n].id<=mid ) update1( val,L,mid,L(n) ); 70 else update1( val,mid+1,R,R(n) ); 71 if( tree[ L(n) ].val<tree[ R(n) ].val ) { 72 tree[ n ].val = tree[ L(n) ].val; 73 tree[ n ].id = tree[ L(n) ].id; 74 } 75 else if( tree[ L(n) ].val==tree[ R(n) ].val ){ 76 if( tree[L(n)].id<tree[R(n)].id ){ 77 tree[ n ].val = tree[ L(n) ].val; 78 tree[ n ].id = tree[ L(n) ].id; 79 } 80 else { 81 tree[ n ].val = tree[ R(n) ].val; 82 tree[ n ].id = tree[ R(n) ].id; 83 } 84 } 85 else { 86 tree[ n ].val = tree[ R(n) ].val; 87 tree[ n ].id = tree[ R(n) ].id; 88 } 89 } 90 91 void update2( int id,int val,int L,int R,int n ){ 92 if( L==R ){ 93 tree[ n ].val += val; 94 return ; 95 } 96 int mid = (L+R)/2; 97 if( id<=mid ) update2( id,val,L,mid,L(n) ); 98 else update2( id,val,mid+1,R,R(n) ); 99 if( tree[ L(n) ].val<tree[ R(n) ].val ) { 100 tree[ n ].val = tree[ L(n) ].val; 101 tree[ n ].id = tree[ L(n) ].id; 102 } 103 else if( tree[ L(n) ].val==tree[ R(n) ].val ){ 104 if( tree[L(n)].id<tree[R(n)].id ){ 105 tree[ n ].val = tree[ L(n) ].val; 106 tree[ n ].id = tree[ L(n) ].id; 107 } 108 else { 109 tree[ n ].val = tree[ R(n) ].val; 110 tree[ n ].id = tree[ R(n) ].id; 111 } 112 } 113 else { 114 tree[ n ].val = tree[ R(n) ].val; 115 tree[ n ].id = tree[ R(n) ].id; 116 } 117 } 118 119 void query( int L,int R,int n ){ 120 if( L==R ) return ; 121 int mid = (L+R)/2; 122 query( L,mid,L(n) ); 123 query( mid+1,R,R(n) ); 124 if( tree[ L(n) ].val<tree[ R(n) ].val ) { 125 tree[ n ].val = tree[ L(n) ].val; 126 tree[ n ].id = tree[ L(n) ].id; 127 } 128 else if( tree[ L(n) ].val==tree[ R(n) ].val ){ 129 if( tree[L(n)].id<tree[R(n)].id ){ 130 tree[ n ].val = tree[ L(n) ].val; 131 tree[ n ].id = tree[ L(n) ].id; 132 } 133 else { 134 tree[ n ].val = tree[ R(n) ].val; 135 tree[ n ].id = tree[ R(n) ].id; 136 } 137 } 138 else { 139 tree[ n ].val = tree[ R(n) ].val; 140 tree[ n ].id = tree[ R(n) ].id; 141 } 142 } 143 144 int main(){ 145 int T; 146 int Case = 1; 147 scanf("%d",&T); 148 while( T-- ){ 149 int n; 150 scanf("%d",&n); 151 for( int i=1;i<=n;i++ ) 152 scanf("%d",&a[i]); 153 build( 1,n,1 ); 154 int m; 155 scanf("%d",&m); 156 int x,y; 157 while( m-- ){ 158 scanf("%d%d",&x,&y); 159 if( x==0 ) update1( y,1,n,1 ); 160 else update2( x,y,1,n,1 ); 161 } 162 query( 1,n,1 ); 163 printf("Case %d: %d %d ",Case++,tree[1].id,tree[1].val); 164 } 165 return 0; 166 }