#include<bits/stdc++.h> #define FILE "sheet" #define MAXN 400100 using namespace std; typedef long long ll; typedef unsigned long long ull; int n,m,K,cnt,tot,nowHash,L[MAXN],R[MAXN],a[MAXN],ans[MAXN],hash[MAXN],num[MAXN],tr[MAXN<<2],flag[MAXN<<2]; ull H[MAXN],Hash[MAXN]; map<ull,bool>vis; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } int find(int x){ int l=1,r=tot; while(l+1<r){ int mid=(l+r)>>1; if(hash[mid]<=x) l=mid; else r=mid; } return hash[l]==x?l:r; } void relord(int p){tr[p]=tr[p<<1]+tr[p<<1|1];} void pushdown(int p){ if(flag[p]){ flag[p<<1]=1; flag[p<<1|1]=1; tr[p<<1]=0; tr[p<<1|1]=0; flag[p]=0; } } void build(int p,int l,int r){ if(l==r) {tr[p]=a[l]; return;} int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); relord(p); } int query(int p,int l,int r,int x,int y){ if(x<=l&&y>=r) return tr[p]; int mid=(l+r)>>1,ret=0; pushdown(p); if(x<=mid) ret+=query(p<<1,l,mid,x,y); if(y>mid) ret+=query(p<<1|1,mid+1,r,x,y); return ret; } void updata(int p,int l,int r,int x,int y){ if(x<=l&&y>=r) {flag[p]=1; tr[p]=0; return;} int mid=(l+r)>>1; pushdown(p); if(x<=mid) updata(p<<1,l,mid,x,y); if(y>mid) updata(p<<1|1,mid+1,r,x,y); relord(p); } int main(){ freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); srand(time(0)); n=read(); m=read(); K=read(); for(int i=1;i<=m;++i){ L[i]=read(); R[i]=read(); num[++cnt]=L[i]; num[++cnt]=R[i]; for(int j=1;j<=10;++j) H[i]=(H[i]<<15)^rand(); } sort(num+1,num+cnt+1); hash[++tot]=num[1]; for(int i=2;i<=cnt;++i)if(num[i]!=num[i-1])hash[++tot]=num[i]; for(int i=1;i<=m;++i) L[i]=find(L[i]),R[i]=find(R[i]); for(int i=1;i<=m;++i) Hash[L[i]]^=H[i],Hash[R[i]]^=H[i]; for(int i=1;i<=tot;++i) Hash[i]^=Hash[i-1]; for(int i=1;i<=tot;++i){ if(vis[Hash[i]]) continue; vis[Hash[i]]=1,a[i]=1; } build(1,1,tot); for(int i=1;i<=m;++i){ if(K<=0) break; int temp=query(1,1,tot,L[i],R[i]-1); if(K>temp){ updata(1,1,tot,L[i],R[i]-1); K-=temp; } else{ ans[++ans[0]]=i; nowHash^=Hash[i]; if(vis[nowHash]) --K; if(L[i]-1>0) updata(1,1,tot,1,L[i]-1); updata(1,1,tot,R[i],tot); } } printf("%d\n",ans[0]); for(int i=1;i<=ans[0];++i) printf("%d ",ans[i]); return 0; }
|