对于每次询问:
如果ai>=s,ai最大贡献为s。
如果ai<s,ai最大贡献为ai。
设数列中大于等于s的数有k个,小于s的数的和为sum。
需要总贡献为c*s,最后只需判断sum+k*s>=c*s即可。
代码:
#include<cstdio>
#include<map>
#include<algorithm>
#define lowbit(x) (x&-x)
#define maxn 1000010
using namespace std;
typedef long long ll;
int n,m,num,t[maxn],a[maxn];
ll tr1[maxn],tr2[maxn];
char cmd[10];
map<int,int>M;
struct que{
int c,x,w;
}q[maxn];
void modify(int pos,int w,ll *tr)
{
for(int i=pos;i<=num;i+=lowbit(i)) tr[i]+=w;
}
ll ask(int pos,ll *tr)
{
ll ans=0;
for(int i=pos;i>0;i-=lowbit(i)) ans+=tr[i];
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%s%d%d",cmd,&q[i].x,&q[i].w);
if(cmd[0]=='U'){
t[++t[0]]=q[i].w;
q[i].c=0;
}else{
t[++t[0]]=q[i].w;
q[i].c=1;
}
}
t[++t[0]]=0;
sort(t+1,t+t[0]+1);
for(int i=1;i<=t[0];i++) if(t[i]!=t[i-1]||i==1) M[t[i]]=++num;
for(int i=1;i<=m;i++){
if(q[i].c==0){
modify(M[a[q[i].x]],-a[q[i].x],tr1);
modify(M[q[i].w],q[i].w,tr1);
modify(M[a[q[i].x]],-1,tr2);
modify(M[q[i].w],1,tr2);
a[q[i].x]=q[i].w;
}else{
ll t1=ask(M[q[i].w],tr1),t2=ask(num,tr2)-ask(M[q[i].w],tr2);
if(t1>=1ll*q[i].w*(q[i].x-t2)){
puts("TAK");
}else{
puts("NIE");
}
}
}
return 0;
}