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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include <iostream> #include <algorithm> #include <ctime> #include <cmath> #include <stdio.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define LL long long #define PI acos(-1.0) #define eps 1e-8 #define Pair pair<double,double>
#define mod 998244353 #define MAXN 1e9 #define MS 1000009
LL n,m; LL a[MS]; struct node{ int l,r; LL cnt,val; }p[MS<<5]; int tot; int root;
void push_up(int &rt){ if(!p[rt].l && !p[rt].r){ rt = 0; } else if(!p[rt].l){ p[rt].cnt = p[p[rt].r].cnt; p[rt].val = p[p[rt].r].val; } else if(!p[rt].r){ p[rt].cnt = p[p[rt].l].cnt; p[rt].val = p[p[rt].l].val; } else{ p[rt].cnt = p[p[rt].l].cnt + p[p[rt].r].cnt; p[rt].val = p[p[rt].l].val + p[p[rt].r].val; } }
void update(int &rt,int pos,int l,int r,LL val,int t){ if(!rt) rt = ++tot; if(l == r){ if(t){ p[rt].cnt++; p[rt].val += val; } else{ p[rt].cnt--; p[rt].val -= val; } if(p[rt].cnt == 0){ rt = 0; } return; } int m = l+r>>1; if(m >= pos) update(p[rt].l,pos,l,m,val,t); else update(p[rt].r,pos,m+1,r,val,t); push_up(rt); }
node get_cnt(int rt,int L,int R,int l,int r){ if(!rt) return {0,0,0,0}; if(L <= l && r <= R){ return p[rt]; } int m = l+r>>1; if(m < L) return get_cnt(p[rt].r,L,R,m+1,r); else if(m >= R) return get_cnt(p[rt].l,L,R,l,m); else{ node ans; node t1 = get_cnt(p[rt].l,L,R,l,m); node t2 = get_cnt(p[rt].r,L,R,m+1,r); ans.cnt = t1.cnt + t2.cnt; ans.val = t1.val + t2.val; ans.l = p[rt].l; ans.r = p[rt].r; return ans; }
}
int main() { ios::sync_with_stdio(false); cin >> n >> m; for(int i=1;i<=n;i++) a[i] = -1; while(m--){ char op; LL pos,val,c,s; cin >> op; if(op == 'U'){ cin >> pos >> val; if(a[pos] != -1) update(root,a[pos],0,MAXN,a[pos],0); a[pos] = val; update(root,a[pos],0,MAXN,a[pos],1); } else if(op == 'Z'){ cin >> c >> s; LL sum = p[root].val; node tt = get_cnt(root,s,MAXN,0,MAXN); sum -= tt.val; sum += tt.cnt*s; if(sum >= c*s){ cout << "TAK\n"; } else{ cout << "NIE\n"; } } }
return 0; }
|