Cod sursa(job #67613)

Utilizator mastermageSchneider Stefan mastermage Data 25 iunie 2007 12:37:04
Problema P-sir Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.44 kb
#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 g=0,j=acc[0];g<i;j=acc[++g]){ //mergem pe acc
			int q=bs(din[j],j,cur),q2=bs2(din[j],j,cur);
			
			din[i][g].k=0,din[i][g].x=j;
			if(cur<vec[j]){
				if(q>=0)din[i][g].k=din[j][q].k;
			}else
			if(cur>vec[j]){
				if(j)din[i][g].k=din[j][j-1].k;
				if(q2>=0)din[i][g].k-=din[j][q2].k;
			}
			
			
			din[i][g].k++;
			if(g)din[i][g].k+=din[i][g-1].k;
			
		}
		
		res+=din[i][i-1].k;
		ins(i);
	}
	
	
	outputFunc();
	return 0;
}