85 求调
查看原帖
85 求调
1359837
Dream_Stars楼主2024/12/21 15:25

rt

# include <bits/stdc++.h>

# define int long long
# define PII pair <int ,int>

using namespace std;

inline int read(){int s = 0 , w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-') , x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x) , putchar(' ');}
inline void writeln(int x){write(x) , putchar('\n');}

# define ls u << 1
# define rs u << 1 | 1
# define inf 1e15
const int N = 3e6 + 10;
int n ,Q;
int a[N] ,pre[N];

struct SGT {int l ,r ,cov ,days ,sum ,mx;}tr[N << 2];

inline void plant (int u ,int days){
  int l = tr[u].l ,r = tr[u].r;
  tr[u].mx += days * a[r];
  tr[u].sum += (pre[r] - pre[l - 1]) * days;
  tr[u].days += days;
} inline void cut (int u ,int val){
  int l = tr[u].l ,r = tr[u].r;
  tr[u].mx = tr[u].cov = val;
  tr[u].sum = val * (r - l + 1);
  tr[u].days = 0;
} inline void pushup (int u){
  tr[u].mx = max (tr[ls].mx ,tr[rs].mx);
  tr[u].sum = tr[ls].sum + tr[rs].sum;
} inline void pushdown (int u){
  if (tr[u].cov != -1){
  	cut (ls ,tr[u].cov) ,cut (rs, tr[u].cov);
  	tr[u].cov = -1;
  } if (tr[u].days){
    plant (ls ,tr[u].days);
    plant (rs ,tr[u].days);
  	tr[u].days = 0;
  }
} inline void build (int u ,int l ,int r){
  tr[u].l = l ,tr[u].r = r;
  tr[u].cov = -1 ,tr[u].sum = tr[u].mx = tr[u].days = 0;
  if (l == r) return;
  int mid = ((l + r) >> 1);
  build (ls ,l ,mid);
  build (rs ,mid + 1 ,r);
  pushup (u);
} inline int search (int u ,int val){
  int l = tr[u].l ,r = tr[u].r;
  pushdown (u);
  if (l == r){
//  	cout << tr[u].sum << ' ' << tr[u].mx << endl; 
  	if (tr[u].mx < val) return inf;
  	return l;
  }
//  pushdown (u);
  int mid = ((l + r) >> 1);
  if (tr[ls].mx >= val) return search (ls ,val);
  else return search (rs ,val);
} inline int cover (int u ,int ql ,int qr ,int val){//区间覆盖 
  int l = tr[u].l ,r = tr[u].r;
  if (l >= ql && r <= qr){
  	int k = tr[u].sum;
  	cut (u ,val);
  	return k - tr[u].sum;
  } 
  pushdown (u);
  int mid = ((l + r) >> 1) ,res = 0;
  if (ql <= mid) res += cover (ls ,ql ,qr ,val);
  if (mid < qr) res += cover (rs ,ql ,qr ,val);
  pushup (u);
  return res;
} signed main (){
  n = read () ,Q = read ();
  for (int i = 1 ; i <= n ; i ++) a[i] = read () ,pre[i] = pre[i - 1] + a[i];
  sort (a + 1 ,a + 1 + n);
  build (1 ,1, n);
  int pred = 0;
  while (Q --){
    int d = read () ,b = read ();
	plant (1 ,d - pred);
	int s = search (1 ,b);
//	cout << s << endl;
	if (s == inf) puts("0");
	else writeln (cover (1 ,s ,n ,b));
	pred = d;
  }
  return 0;
}
2024/12/21 15:25
加载中...