Pagini recente » Cod sursa (job #2407583) | Cod sursa (job #615879) | Cod sursa (job #3031853) | Cod sursa (job #2072449) | Cod sursa (job #67591)
Cod sursa(job #67591)
#include <stdio.h>
#define maxN 2010
struct st{short x;unsigned k;operator int()const{return x;}};
unsigned res;
int n,vec[maxN],acc[maxN],an=1;
st*din[maxN];
int bs(st*v,int n,int x){if(!n)return -1;
int st=0,en=n-1,m;
while(st<en){
m=st+en>>1;
if(x<=vec[v[m]])en=m;else st=m+1;
}
while(vec[v[st]]>=x && st>=0)st--;
return st;
}
int bs2(st*v,int n,int x){if(!n)return -1;
int st=0,en=n-1,m;
while(st<en){
m=st+en>>1;
if(x<=vec[v[m]])en=m;else st=m+1;
}
while(vec[v[st]]==x && st<n-1)st++;
while(vec[v[st]]>x && st>=0)st--;
return st;
}
void ins(int x){int p=0;while(p<an && vec[acc[p]]<=x)p++;for(int j=an++;j>p;j--)acc[j]=acc[j-1];acc[p]=x;}
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();
for(int i=1;i<n;i++){
int cur=vec[i];din[i]=new st[i];
for(int _j=0,j=acc[0];_j<i;j=acc[++_j]){ //mergem pe acc
int q=bs(din[j],j,cur),q2=bs2(din[j],j,cur);
din[i][_j].k=0,din[i][_j].x=j;
if(cur<vec[j]){
if(q>=0)din[i][_j].k=din[j][q].k;
}else{
if(j)din[i][_j].k=din[j][j-1].k;
if(q2>=0)din[i][_j].k-=din[j][q2].k;
}
din[i][_j].k++;
if(_j)din[i][_j].k+=din[i][_j-1].k;
}
res+=din[i][i-1].k;
ins(i);
}
outputFunc();
return 0;
}