第10个点WA,向大佬们求助
解释一下,lmax,rmax为维护区间最大字段和的,sum为区间总和,ans为最终合法答案。
#include <bits/stdc++.h>
using namespace std;
#define N 1000010
typedef long long ll;
const ll inf = (ll)1e18;
template <class T>
inline void read(T& a){
T x = 0, s = 1;
char c = getchar();
while(!isdigit(c)){
if(c == '-') s = -1;
c = getchar();
}
while(isdigit(c)){
x = x * 10 + (c ^ '0');
c = getchar();
}
a = x * s;
return ;
}
int n, m, K, d;
struct tree{
ll lmax, rmax, sum, ans;
} e[N << 2];
inline void pushup(int o){
e[o].sum = e[o << 1].sum + e[o << 1 | 1].sum;
e[o].lmax = max(e[o << 1].lmax,e[o << 1].sum + e[o << 1 | 1].lmax);
e[o].rmax = max(e[o << 1 | 1].rmax, e[o << 1 | 1].sum + e[o << 1].rmax);
e[o].ans = max(e[o << 1].ans, max(e[o << 1 | 1].ans, e[o << 1].rmax + e[o << 1 | 1].lmax));
return ;
}
void build(int o, int l,int r){
if(l == r){
e[o] = (tree){-K, -K, -K, -K};
return ;
}
int mid = l + r >> 1;
build(o << 1, l, mid);
build(o << 1 | 1, mid + 1, r);
pushup(o);
return ;
}
void update(int o, int l, int r, int x, ll k){
if(l > x || r < x) return ;
if(l == r && l == x){
e[o].ans += k, e[o].sum += k;
e[o].lmax += k, e[o].rmax += k;
return ;
}
int mid = l + r >> 1;
update(o << 1, l, mid, x, k);
update(o << 1 | 1,mid + 1, r, x, k);
pushup(o);
return ;
}
int main(){
read(n), read(m), read(K), read(d);
build(1, 1, n);
while(m--){
int x, y;
read(x), read(y);
update(1, 1, n, x, y);
puts(e[1].ans <= K * d ? "TAK" : "NIE");
}
return 0;
}