| 比赛 |
期末考试2 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
物流 |
最终得分 |
100 |
| 用户昵称 |
dream |
运行时间 |
3.721 s |
| 代码语言 |
C++ |
内存使用 |
39.89 MiB |
| 提交时间 |
2026-02-10 11:38:44 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000005,V=1000000000;
struct node{
int cnt,ls,rs;
ll sum;
}tr[N*21];
int n,m,tot,root;
void pushup(int p){
tr[p].sum=tr[tr[p].ls].sum+tr[tr[p].rs].sum;
tr[p].cnt=tr[tr[p].ls].cnt+tr[tr[p].rs].cnt;
}
void update(int &p,int l,int r,int x,ll v){
if(!p) p=++tot;
if(l==r){
tr[p].cnt+=v;
tr[p].sum+=v*x;
return;
}
int mid=(l+r)/2;
if(x<=mid) update(tr[p].ls,l,mid,x,v);
else update(tr[p].rs,mid+1,r,x,v);
pushup(p);
}
ll query_sum(int p,int l,int r,int x){
if(!p) return 0;
if(r<=x) return tr[p].sum;
int mid=(l+r)/2;
ll sum=0;
sum+=query_sum(tr[p].ls,l,mid,x);
if(x>mid){
sum+=query_sum(tr[p].rs,mid+1,r,x);
}
return sum;
}
int query_cnt(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tr[p].cnt;
int mid=(l+r)/2;
int cnt=0;
if(ql<=mid) cnt+=query_cnt(tr[p].ls,l,mid,ql,qr);
if(qr>mid) cnt+=query_cnt(tr[p].rs,mid+1,r,ql,qr);
return cnt;
}
int c[N];
int main(){
freopen("logistics.in","r",stdin);
freopen("logistics.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
char op;
int a,b;
cin>>op>>a>>b;
if(op=='U'){
if(c[a]) update(root,1,V,c[a],-1);
if(b) update(root,1,V,b,1);
c[a]=b;
}
else{
int qcnt1=query_cnt(root,1,V,1,V),qcnt2=query_cnt(root,1,V,b,V);
ll qsum=query_sum(root,1,V,b-1);
if(qcnt1<a){
cout<<"NIE\n";
}
else{
if(qcnt2>=a){
cout<<"TAK\n";
}
else{
if(qsum/b+qcnt2>=a){
cout<<"TAK\n";
}
else{
cout<<"NIE\n";
}
}
}
}
}
return 0;
}