比赛 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;
}