#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
typedef long long LL;
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MP make_pair
#define ST first
#define ND second
#define PB push_back
#define FOR(i,b,e) for(int i=(b); i<=(e); ++i)
#define FORD(i,b,e) for(int i=(b); i>=(e); --i)
#define REP(i,n) for(int i=0; i<n; ++i)
#define VAR(v,n) __typeof(n) v = (n)
#define SIZE(x) ((int)(x).size())
#define FOREACH(i,x) for(VAR(i,(x).begin()); i!=(x).end(); ++i)
#define SC scanf
#define PR printf
#define MAXM 500002
int tr[MAXM];
LL sum[MAXM];
map<int, pair<LL,LL> > koszenia;
typedef map<int, pair<LL,LL> >::iterator iter;
int kos(int d, LL t, LL h){
iter it = koszenia.upper_bound(d);
--it;
return h < it->ND.ND+(t-it->ND.ST)*tr[d];
}
int main() {
int n,m;
LL t,h,last;
SC("%d %d", &n, &m);
REP(i,n) SC("%d", tr+i);
sort(tr,tr+n);
sum[n] = 0;
sum[n-1] = tr[n-1];
FORD(i,n-2,0) sum[i]=sum[i+1]+tr[i];
koszenia.insert(MP(0,MP(0,0)));
REP(i,m){
scanf("%lld %lld", &t, &h);
int b=0, e=n-1;
while (b < e)
{
int d = (b+e)/2;
if(kos(d,t,h))
e = d;
else
b = d+1;
}
if(!kos(e,t,h))
printf("0\n");
else {
LL res = 0;
iter it = koszenia.upper_bound(e);
it--;
last = n;
iter itrem = koszenia.end();
itrem--;
for(; itrem != it; --itrem){
res+=(last-itrem->ST)*(itrem->ND.ND-h)+(sum[itrem->ST]-sum[last])*(t-itrem->ND.ST);
last=itrem->ST;
}
res+=(last-e)*(it->ND.ND-h)+(sum[e]-sum[last])*(t-it->ND.ST);
printf("%lld\n", res);
if(it->ST!=e) ++it;
koszenia.erase(it, koszenia.end());
koszenia.insert(MP(e,MP(t,h)));
}
}
return 0;
}
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 87 88 89 | #include <cstdio> #include <cstdlib> #include <vector> #include <set> #include <map> #include <string> #include <algorithm> using namespace std; typedef long long LL; #define MAX(a,b) ((a) > (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MP make_pair #define ST first #define ND second #define PB push_back #define FOR(i,b,e) for(int i=(b); i<=(e); ++i) #define FORD(i,b,e) for(int i=(b); i>=(e); --i) #define REP(i,n) for(int i=0; i<n; ++i) #define VAR(v,n) __typeof(n) v = (n) #define SIZE(x) ((int)(x).size()) #define FOREACH(i,x) for(VAR(i,(x).begin()); i!=(x).end(); ++i) #define SC scanf #define PR printf #define MAXM 500002 int tr[MAXM]; LL sum[MAXM]; map<int, pair<LL,LL> > koszenia; typedef map<int, pair<LL,LL> >::iterator iter; int kos(int d, LL t, LL h){ iter it = koszenia.upper_bound(d); --it; return h < it->ND.ND+(t-it->ND.ST)*tr[d]; } int main() { int n,m; LL t,h,last; SC("%d %d", &n, &m); REP(i,n) SC("%d", tr+i); sort(tr,tr+n); sum[n] = 0; sum[n-1] = tr[n-1]; FORD(i,n-2,0) sum[i]=sum[i+1]+tr[i]; koszenia.insert(MP(0,MP(0,0))); REP(i,m){ scanf("%lld %lld", &t, &h); int b=0, e=n-1; while (b < e) { int d = (b+e)/2; if(kos(d,t,h)) e = d; else b = d+1; } if(!kos(e,t,h)) printf("0\n"); else { LL res = 0; iter it = koszenia.upper_bound(e); it--; last = n; iter itrem = koszenia.end(); itrem--; for(; itrem != it; --itrem){ res+=(last-itrem->ST)*(itrem->ND.ND-h)+(sum[itrem->ST]-sum[last])*(t-itrem->ND.ST); last=itrem->ST; } res+=(last-e)*(it->ND.ND-h)+(sum[e]-sum[last])*(t-it->ND.ST); printf("%lld\n", res); if(it->ST!=e) ++it; koszenia.erase(it, koszenia.end()); koszenia.insert(MP(e,MP(t,h))); } } return 0; } |
English