一个比较麻烦的模拟...

#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct vv{
    int id,t;
    bool operator<(const vv &b)const{
        return b.t==t?id<b.id:t<b.t;
    }
}a[4][N];
int k,m,n;
int need;
int num[4];//4个id的指针.
set<vv>all,choose;//确实没有这个实力写这种模拟题...
int sum[4][N];
int cnt=0;
void range(int x)
{
    if(x<=k)//A B会改变.
    {
        need=m-x-(2*(k-x));
        if(k-x+1<=num[1]) all.insert(a[1][k-x+1]);
        if(k-x+1<=num[2]) all.insert(a[2][k-x+1]);
    }else need=m-x;
}

void upch()
{
    if(need<0) need=0;
    set<vv>::iterator it;
    while(choose.size()>need) it=--choose.end(),cnt-=it->t,all.insert(*it),choose.erase(it);
    while(choose.size()<need&&all.size())   cnt+=(it=all.begin())->t,choose.insert(*it),all.erase(it);
    while(choose.size()&&all.size()&&(it=--choose.end())->t>all.begin()->t)
    {
        cnt+=all.begin()->t;cnt-=(it=--choose.end())->t;
        all.insert(*it);choose.erase(it);
        choose.insert(*all.begin());all.erase(all.begin());
    }
}

int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
    {
        int v,x,y;
        scanf("%d%d%d",&v,&x,&y);
        int p=x+2*y;
        a[p][++num[p]].id=i;
        a[p][num[p]].t=v;
    }
    for(int i=0;i<4;i++) sort(a[i]+1,a[i]+1+num[i]);
    for(int i=0;i<4;i++)
    {
        for(int j=1;j<=num[i];j++)
        {
            sum[i][j]+=sum[i][j-1]+a[i][j].t;
        }
    }
    int start=0;
    while(start<=num[3]&&((num[1]+start<k)||(num[2]+start<k)||(m-start-2*(k-start)<0))) start++;//A B要取k 加起来得有m
    if(start==num[3]+1) { puts("-1"); return 0; }
    //预处理...xswl这tm才预处理...
    //枚举1 1 all是所有可选的 choose是已经选了的
    long long ans=1e16,pos=-1;
    for(int i=0;i<3;i++)
    {
        for(int j=num[i];j>(i==0?0:k-start);j--)
            all.insert(a[i][j]);
    }
    for(int i=start;i<=num[3];i++)
    {
        range(i);upch();
        long long res=sum[3][i]+cnt;
        if(i<=k) res+=sum[1][k-i]+sum[2][k-i];
        if(res<ans&&((k-i>=0)?(i+2*(k-i)+choose.size()==m):(i+choose.size()==m)))
        {
            ans=res;
            pos=i;
            //cout<<ans<<' '<<pos<<endl;
        }
    }

    //cout<<pos<<endl;
    printf("%lld\n",ans);
    all.clear();choose.clear();
    for(int i=0;i<3;i++)
    {
        for(int j=num[i];j>(i==0?0:k-start);j--)
            all.insert(a[i][j]);
    }
    for(int i=start;i<=num[3];i++)
    {
        range(i);upch();
        if(i==pos)
        {
            for(int j=1;j<=i;j++) printf("%d ",a[3][j].id);
            for(int j=1;j<=k-i;j++) printf("%d %d ",a[1][j].id,a[2][j].id);
            for(auto it=choose.begin();it!=choose.end();it++) printf("%d ",it->id);
            puts("");
            return 0;
        }
    }
    puts("-1");
    return 0;
}