TH讠NK @ 2019-08-16 15:48:00
RT
糊了一颗
#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define ls t[p].ch[0]
#define rs t[p].ch[1]
#define get(x) (t[t[x].fa].ch[1]==x)
const int maxn=2000005, inf=1<<30;
int tot,root,a[maxn];
il int read(){
int x=0,f=1; char c=getchar();
while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();}
while(c>='0' && c<='9') x=x*10+c-48, c=getchar();
return x*f;
}
struct tree{
int ch[2],size,cnt,fa,w;
ll sum;
} t[maxn];
il void pushup(int p){
t[p].size=t[ls].size+t[rs].size+t[p].cnt;
t[p].sum=t[ls].sum*(ls!=1)+t[rs].sum*(rs!=2)+t[p].cnt*t[p].w;
}
il void rotate(int x){
int y=t[x].fa, yson=get(x);
int z=t[x].ch[yson^1], rt=t[y].fa;
t[x].fa=rt, t[rt].ch[get(y)]=x;
t[y].fa=x, t[x].ch[yson^1]=y;
t[z].fa=y, t[y].ch[yson]=z;
pushup(y), pushup(x);
}
il void splay(int x,int to){
while(t[x].fa!=to){
int y=t[x].fa;
if(t[y].fa!=to) get(x)==get(y)? rotate(y):rotate(x);
rotate(x);
}
if(to==0) root=x;
}
il void find(int w){
int p=root;
while(t[p].w!=w && t[p].ch[w>t[p].w]) p=t[p].ch[w>t[p].w];
splay(p,0);
}
il int Next(int w,int d){
find(w);
int p=root;
if(t[p].w!=w && (t[p].w>w)==d) return p;
p=t[p].ch[d]; d^=1;
while(t[p].ch[d]) p=t[p].ch[d];
splay(p,0);
return p;
}
il void add(int w){
int p=root,f=0;
while(p && t[p].w!=w) f=p, p=t[p].ch[w>t[p].w];
if(p) t[p].cnt++;
else{
p=++tot;
if(f) t[f].ch[w>t[f].w]=p;
t[p].size=t[p].cnt=1;
t[p].ch[0]=t[p].ch[1]=0;
t[p].fa=f, t[p].w=t[p].sum=w;
}
splay(p,0);
}
il void del(int w){
int lst=Next(w,0), nxt=Next(w,1);
splay(lst,0), splay(nxt,lst);
int p=t[nxt].ch[0];
if(t[p].cnt>1) t[p].cnt--, splay(p,0);
else t[nxt].ch[0]=0;
}
il void ask(int c,int s){
int x=Next(s,0);
splay(x,0);
int y=t[x].ch[1];
ll sum=t[x].sum*(x!=1)-t[y].sum*(y!=2);
if(c-t[y].size+1<=0 || sum>=1ll*(c-t[y].size+1)*s) printf("TAK\n");
else printf("NIE\n");
}
int main(){
int n,m,x,y;
char opt[2];
add(-inf), add(inf);
n=read(), m=read();
for(int i=1;i<=n;i++) a[i]=0, add(0);
while(m--){
scanf("%s",opt);
x=read(), y=read();
if(opt[0]=='U'){
del(a[x]);
a[x]=y;
add(y);
}
else ask(x,y);
}
return 0;
}
by Vanity_ @ 2019-08-16 18:44:23