Listing: CINEMA.CPP 
#include<stdio.h> 
 #include<mem.h> 
 #include<process.h> 
 
 int n,a[1001],all2=1,v[1001],total[3],MAX=0; 
 FILE *f; 
 
 
 void citire(){ 
 f=fopen("CINEMA.IN","r"); 
 fscanf(f,"%d",&n); 
 for(int i=1;i<=n;i++) 
 fscanf(f,"%d",&a[i]); 
 fclose(f); 
 } 
 
 void identica(){ 
 memset(v,0,sizeof(v)); 
 int da=1; 
 for(int i=1;i<=n;i++) 
 if(a[i]!=i) 
 da=0; 
 else v[i]=1; 
 if (da){ 
 f=fopen("cinema.out","w"); 
 fprintf(f,"0"); 
 fclose(f); 
 exit(0); 
 } 
 } 
 
 void gaseste_ciclu(int k){ 
 v[k]=1; 
 int i=a[k],lung=1; 
 while (i!=k) v[i]=1,i=a[i],lung++; 
 if (lung>2) all2=2; 
 total[1]+=lung/2; 
 total[2]+=(lung-1)/2; 
 } 
 
 void prelucreaza_ciclu(int k){ 
 int c[1001],i=a[k],lung=1; 
 v[k]=1; 
 c[lung]=k; 
  while (i!=k) c[++lung]=i,v[i]=1,i=a[i]; 
 for(i=1;i<=lung/2;i++){ 
 fprintf(f,"%d %d\n",c[i],c[lung-i+1]); 
 int aux=a[c[i]]; 
 a[c[i]]=a[c[lung-i+1]]; 
 a[c[lung-i+1]]=aux; 
 } 
 if (lung>MAX) MAX=lung; 
 } 
 
 void prelucrare(){ 
 total[1]=total[2]=0; 
 for (int i=1;i<=n;i++) 
 if (!v[i]) gaseste_ciclu(i); 
 f=fopen("cinema.out","w"); 
 fprintf(f,"%d\n",all2); 
 for (int pas=1;pas<=all2;pas++){ 
 fprintf(f,"%d\n",total[pas]); 
 memset(v,0,sizeof(v)); 
 for (i=1;i<=n;i++) 
 if (!v[i]) prelucreaza_ciclu(i); 
 } 
 fclose(f); 
 printf("%d\n",MAX); 
 } 
 
 void main(){ 
 citire(); 
 identica(); 
 prelucrare(); 
 } 

[cuprins]