| 比赛 |
2026.9.5 |
评测结果 |
AAAAAAAAAAAAAAA |
| 题目名称 |
Pretty Pens |
最终得分 |
100 |
| 用户昵称 |
exil |
运行时间 |
8.881 s |
| 代码语言 |
C++ |
内存使用 |
84.89 MiB |
| 提交时间 |
2026-09-05 12:37:00 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int c[200005],p[200005];
int cc[200005];
int pp[200005];
map<int,int>mm;
int wen[200005][3];
int ans;
vector<int>v[200005];
struct node{
int l,r;
int lx,rx;
int maxx;
int ji;
};
vector<node> shu[200005];
node tree[1600005];
node citree[1600005];
int kk;
int find(int x,int s){
return lower_bound(v[s].begin(),v[s].end(),x)-v[s].begin()+1;
}
int jianshu(int l,int r,int s){
kk++;
int dian=kk;
shu[s].push_back({l,r,0,0,0,0});
if(l==r){
//if(k==3)cout<<l<<" "<<r<<endl;
return dian;
}
int mid=(l+r)/2;
int ee=jianshu(l,mid,s);
shu[s][dian].lx = ee;
int qq=jianshu(mid+1,r,s);
shu[s][dian].rx = qq;
return dian;
}
void jianshu2(int k,int l,int r){
tree[k]={l,r,0,0,0,0};
citree[k]={l,r,0,0,0,0};
if(l==r){
return;
}
int mid=(l+r)/2;
jianshu2(k<<1,l,mid);
jianshu2(k<<1|1,mid+1,r);
}
void add(int d,int now,int s){
if(shu[s][now].l>d || shu[s][now].r<d)return;
if(shu[s][now].l==shu[s][now].r && shu[s][now].l==d){
shu[s][now].maxx=v[s][d-1];
shu[s][now].ji+=1;
//cout<<now<<" "<<v[s][d-1]<<" "<<shu[s][now].ji<<endl;
return;
}
add(d,shu[s][now].lx,s);
add(d,shu[s][now].rx,s);
int ll=shu[s][shu[s][now].lx].maxx,rr=shu[s][shu[s][now].rx].maxx;
shu[s][now].maxx=max(ll,rr);
//cout<<shu[s][now].l<<" "<<shu[s][now].r<<" "<<shu[s][now].maxx<<" "<<ll<<" "<<shu[s][shu[s][now].rx].l<<" "<<shu[s][shu[s][now].rx].r<<" "<<endl;
}
void jian(int d,int now,int s){
if(shu[s][now].l>d || shu[s][now].r<d)return;
if(shu[s][now].l==shu[s][now].r && shu[s][now].l==d){
shu[s][now].ji--;
if(shu[s][now].ji==0){
shu[s][now].maxx=0;
shu[s][now].ji=0;
}
return;
}
jian(d,shu[s][now].lx,s);
jian(d,shu[s][now].rx,s);
int ll=shu[s][shu[s][now].lx].maxx,rr=shu[s][shu[s][now].rx].maxx;
shu[s][now].maxx=max(ll,rr);
//cout<<shu[s][now].l<<" "<<shu[s][now].r<<" "<<shu[s][now].maxx<<" "<<ll<<" "<<shu[s][shu[s][now].rx].l<<" "<<shu[s][shu[s][now].rx].r<<" "<<endl;
}
void add2(int k,int d,int zhi){
if(tree[k].l>d || tree[k].r<d)return;
if(tree[k].l==tree[k].r && tree[k].l==d){
tree[k].maxx=zhi;
return;
}
add2(k<<1,d,zhi);
add2(k<<1|1,d,zhi);
int ll,rr;
if(tree[k<<1].maxx==0)ll=INT_MAX;
else ll=tree[k<<1].maxx;
if(tree[k<<1|1].maxx==0)rr=INT_MAX;
else rr=tree[k<<1|1].maxx;
tree[k].maxx=min(ll,rr);
//cout<<"i"<<tree[k].maxx<<endl;
}
void add3(int k,int d,int zhi){
if(citree[k].l>d || citree[k].r<d)return;
if(citree[k].l==d && citree[k].r==citree[k].l){
citree[k].maxx=zhi;
return;
}
add3(k<<1,d,zhi);
add3(k<<1|1,d,zhi);
int ll,rr;
ll=citree[k<<1].maxx;
rr=citree[k<<1|1].maxx;
citree[k].maxx=max(ll,rr);
}
signed main(){
freopen("Pens.in","r",stdin);
freopen("Pens.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,q;
cin>>n>>m>>q;
for(int i = 1;i<=n;i++){
cin>>c[i]>>p[i];
cc[i]=c[i];
pp[i]=p[i];
if(mm[c[i]*114514+p[i]*998244353]==0){
mm[c[i]*114514+p[i]*998244353]=1;
v[c[i]].push_back(p[i]);
}
}
for(int i = 1;i<=q;i++){
int r,a,b;
cin>>r>>a>>b;
wen[i][0]=r;
wen[i][1]=a;
wen[i][2]=b;
if(r==2){
//p[a]=b;
pp[a]=b;
if(mm[cc[a]*114514+b*998244353]==0){
mm[cc[a]*114514+b*998244353]=1;
v[cc[a]].push_back(b);
}
}
else{
cc[a]=b;
//c[a]=b;
if(mm[b*114514+pp[a]*998244353]==0){
mm[b*114514+pp[a]*998244353]=1;
v[b].push_back(pp[a]);
}
}
}
jianshu2(1,1,m);
for(int i = 1;i<=m;i++){
sort(v[i].begin(),v[i].end());
v[i].erase(unique(v[i].begin(),v[i].end()),v[i].end());
//cout<<v[i][0]<<" "<<v[i][1]<<" "<<find(v[i][1],i)<<endl;
kk=0;
shu[i].push_back({0,0,0,0,0});
jianshu(1,v[i].size()+1,i);
}
for(int i = 1;i<=n;i++){
add(find(p[i],c[i]),1,c[i]);
//cout<<find(p[i],c[i])<<" ";
}
int minn=INT_MAX,ci=0;
for(int i = 1;i<=m;i++){
ans+=shu[i][1].maxx;
int da=shu[i][1].maxx;
add2(1,i,da);
minn=min(minn,shu[i][1].maxx);
jian(find(da,i),1,i);
int e=shu[i][1].maxx;
ci=max(ci,e);
add3(1,i,e);
add(find(da,i),1,i);
//cout<<shu[1][1].maxx<<endl;
}
if(minn<ci){
cout<<ans-minn+ci<<"\n";
}
else cout<<ans<<"\n";
for(int i = 1;i<=q;i++){
if(wen[i][0]==2){
int da=shu[c[wen[i][1]]][1].maxx,cida;
//cout<<da<<" "<<c[wen[i][1]]<<" ";
ans-=da;
jian(find(p[wen[i][1]],c[wen[i][1]]),1,c[wen[i][1]]);
add(find(wen[i][2],c[wen[i][1]]),1,c[wen[i][1]]);
//cout<<"i"<<v[2][find(25,c[wen[i][1]])-2]<<endl;
p[wen[i][1]]=wen[i][2];
da=shu[c[wen[i][1]]][1].maxx;
add2(1,c[wen[i][1]],da);
int ee=da;
jian(find(ee,c[wen[i][1]]),1,c[wen[i][1]]);
cida=shu[c[wen[i][1]]][1].maxx;
add(find(ee,c[wen[i][1]]),1,c[wen[i][1]]);
add3(1,c[wen[i][1]],cida);
ans+=da;
//cout<<tree[1].maxx<<" "<<citree[1].maxx<<" "<<da<<" "<<cida<<endl;
//输出
if(tree[1].maxx<citree[1].maxx){
cout<<ans-tree[1].maxx+citree[1].maxx<<"\n";
}
else cout<<ans<<"\n";
}
else{
int da1=shu[c[wen[i][1]]][1].maxx,cida1,da2,cida2;
da2=shu[wen[i][2]][1].maxx;
//cout<<da<<" "<<c[wen[i][1]]<<" ";
ans-=da1;
ans-=da2;
jian(find(p[wen[i][1]],c[wen[i][1]]),1,c[wen[i][1]]);
add(find(p[wen[i][1]],wen[i][2]),1,wen[i][2]);
da1=shu[c[wen[i][1]]][1].maxx;
add2(1,c[wen[i][1]],da1);
da2=shu[wen[i][2]][1].maxx;
add2(1,wen[i][2],da2);
int ee=da1;
jian(find(ee,c[wen[i][1]]),1,c[wen[i][1]]);
cida1=shu[c[wen[i][1]]][1].maxx;
add(find(ee,c[wen[i][1]]),1,c[wen[i][1]]);
ee=da2;
jian(find(ee,wen[i][2]),1,wen[i][2]);
cida2=shu[wen[i][2]][1].maxx;
add(find(ee,wen[i][2]),1,wen[i][2]);
add3(1,c[wen[i][1]],cida1);
add3(1,wen[i][2],cida2);
ans+=da1+da2;
c[wen[i][1]]=wen[i][2];
//输出
//cout<<da1<<" "<<da2<<" "<<cida1<<" "<<cida2<<" "<<ans<<endl;
if(tree[1].maxx<citree[1].maxx){
cout<<ans-tree[1].maxx+citree[1].maxx<<"\n";
}
else cout<<ans<<"\n";
}
}
return 0;
}