Pagini recente » Cod sursa (job #1298340) | Cod sursa (job #1100532) | Cod sursa (job #1785846) | Cod sursa (job #1119329) | Cod sursa (job #67890)
Cod sursa(job #67890)
#include <stdio.h>
#define maxN 2000
#define fo(i,n) for(int i=0;i<n;i++)
int n,vec[maxN],res,*din[maxN],*ref[maxN];
int ss[maxN],k;
int cautS(int*v,int n,int x){
int st=0,en=n-1,m;
while(st<en){
m=st+en>>1;
if(x<=v[m])en=m;else st=m+1;
}
while(en>=0 && v[en]>=x)en--;
return en;
}
int cautD(int*v,int n,int x){
int st=0,en=n-1,m;
while(st<en){
m=st+en;m=(m>>1)+(m&1);
if(x<v[m])en=m-1;else st=m;
}
while(en>=0 && v[en]>x)en--;
return en;
}
void ins(int p){int i,j,x=vec[p];for(i=0;i<k && vec[ss[i]]<=x ;i++);for(j=k++;j>i;j--)ss[j]=ss[j-1];ss[i]=p;}
void inputFunc(){FILE*fi=fopen("psir.in","r");fscanf(fi,"%d",&n);for(int i=0;i<n;i++)fscanf(fi,"%d",vec+i);fclose(fi);}void outputFunc(){FILE*fi=fopen("psir.out","w");fprintf(fi,"%u",res);fclose(fi);}
int main(){
inputFunc();
ins(0);
for(int i=1;i<n;i++){
int cur=vec[i];
din[i]=new int[i],ref[i]=new int[i];
fo(j,i){
int g=ss[j], dref=vec[g];
din[i][j]=1,ref[i][j]=dref;
if(cur<dref){
int q=cautS(ref[g],g,cur);
if(q>=0)din[i][j]+=din[g][q];
}else
if(cur>dref){
int q=cautD(ref[g],g,cur);
if(g)din[i][j]+=din[g][g-1];
if(q>=0)din[i][j]-=din[g][q];
}
if(j)din[i][j]+=din[i][j-1];
}
res+=din[i][i-1];
ins(i);
}
outputFunc();
return 0;
}