//这是我重新打的更新过后的程序,应该耗时比你的少许多,应该可以通过了。
#include
#define size 100010
using namespace std;
int a[size]; //数组定在函数里面往往会让程序莫名挂掉
int n,m,max,min,maxx,minx; //maxx 和 minx 分别表示 max 和 min 所在的位置这样可以用来优化
void new_max(){ //这个函数用来更新 max和 maxx的值
for(int i=1;i<=n;i++)
if(a[i]>max){
max=a[i];
maxx=i;
}
}
int main(){
int base,attack;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
max=a[1];maxx=1; //从 23 行到 32为 max,min的初始值
min=a[1];minx=1;
for(int i=2;i<=n;i++){
if(a[i]>max){
max=a[i]; maxx=i;
}
if(a[i] min=a[i]; minx=i;
}
}
//对于你程序的优化在于这样一点:攻击只会降防御,所以每次攻击都是对当前基地只减不加
//例如攻击的如果不是之前的最大防御,那么最大防御依然是最大防御。如果攻击的是最大防御,那么就需要重新寻找了。
//类似的,如果攻击的是最小防御,那么最小防御攻击后依然是最小防御,如果不是那就比较攻击后的防御与之前的最小防御
for (int i=1;i<=m;i++){
scanf ("%d %d",&base,&attack);
a[base]-=attack;
if (a[base]<0) a[base]=0;
if(base==maxx){ //如果攻击了最大防御
max=a[base];
new_max(); //更新最大防御
}
if(base==minx) //如果攻击了最小防御
min=a[base];
else //如果攻击的不是最小防御
if(min>a[base]){
min=a[base];
minx=base;
}
printf("%d %d\n",max,min);
}
return 0;
}