冷静分析:
一个那种东西怎么会被使用?
对于大于s的最多次次被选贡献为s
小余的贡献为本来的权值。
辣么怎么办?
两个树状数组分别维护这两个值就好了(一个是值的个数,一个是值的和)
#include<bits/stdc++.h>
using namespace std;
typedef int INT;
#define int long long
const int N=2e6+100;
const int maxn=2e6+1;
inline void read(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=f;
}
struct BIT{
int T[N];
BIT(){
memset(T,0,sizeof(T));
}
inline int lowbit(int x){
return x&(-x);
}
void update(int x,int val){
if(x==0)
return;
while(x<=maxn){
T[x]+=val;
x+=lowbit(x);
}
}
int query(int x){
int ret=0;
while(x){
ret+=T[x];
x-=lowbit(x);
}
return ret;
}
}A,B;
int n,m;
int sum[N]={};
int mmp[N]={};
int cnt=0;
struct Query{
int c,x,y;
}Q[N];
INT main(){
// freopen("3471.in","r",stdin);
read(n);
read(m);
for(int i=1;i<=m;i++){
char opt[3];
scanf("%s",opt);
if(opt[0]=='U'){
Q[i].c=1;
read(Q[i].x);
read(Q[i].y);
cnt++;
mmp[cnt]=Q[i].y;
}
else{
Q[i].c=2;
read(Q[i].x);
read(Q[i].y);
cnt++;
mmp[cnt]=Q[i].y;
}
}
sort(mmp+1,mmp+1+cnt);
cnt=unique(mmp+1,mmp+1+cnt)-mmp-1;
for(int i=1;i<=m;i++){
if(Q[i].c==1){
int k,a;
// cout<<"in";
k=Q[i].x;
a=Q[i].y;
a=lower_bound(mmp+1,mmp+1+cnt,a)-mmp;
A.update(sum[k],-mmp[sum[k]]);
A.update(a,mmp[a]);
// cout<<"here"<<'\n';
B.update(sum[k],-1);
B.update(a,1);
sum[k]=a;
}
else{
int c=Q[i].x;
int s=Q[i].y;
s=lower_bound(mmp+1,mmp+1+cnt,s)-mmp;
int ans=A.query(s-1);
ans+=(B.query(maxn)-B.query(s-1))*mmp[s];
//cout<<"ans= "<<ans<<" ";
if(ans<c*mmp[s]){
puts("NIE");
//printf("NIE\n");
}
else puts("TAK");//cout<<"TAK"<<'\n';
}
}
//cout<<A.query(10);
}