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
//ehh braklo czasu, może brutal dostanie jakis punkt :-)
#include<cstdio>
#include <algorithm>
int LiczbaTraw,LiczbaSkoszen;
int A[500100];
long long T[500100];
long long d,b;
long long popd=0;

inline bool f(int a,int b){return (a<b);}
inline bool f2(int i){return (i>b);}

main(){
scanf("%d%d",&LiczbaTraw,&LiczbaSkoszen);
for(int i=0;i<LiczbaTraw;i++)scanf("%d",A+i);
std::sort(A,A+LiczbaTraw,f);
popd=0;
for(int s=0;s<LiczbaSkoszen;s++){
//long long d,b;
scanf("%lld%lld",&d,&b);
for (int i=0;i<LiczbaTraw;i++)T[i]+=(long long)(d-popd)*A[i];  //rosniecie trawy
long long siano=0;
long long*wT=std::find_if(T,T+LiczbaTraw,f2);
for (int i=wT-T;i<LiczbaTraw;i++){siano+=T[i]-b,T[i]=b;}//koszenie
printf("%lld\n",siano);  
popd=d;
} 
}