| #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; }
 |