3250

id:Ozy:20070711#p2から。
とりあえず、問題を単純に実装してみる。

c,s[80001],j;
main(v){
	gets(s);
	for(*s=8e9;~scanf("%d",&v);c+=j,s[++j]=v)
		while(s[j]<=v)--j;
	printf("%u",c);
}

最初の*s=8e9は番兵。
あとは生きている数字をsに突っ込んでいって、その数を計算するだけ。


さて、冗長な書き方を短縮するためのイディオムを適当に注入していく。
まず二重ループの展開とgetsの削除
最初は簡単にargcをフラグにする

c,s[80001],j,v;
main(i){
	for(*s=8e9;v<s[j]?
		i--<0?c+=j,s[++j]=v:0,~scanf("%d",&v):~--j;);
	printf("%u",c);
}

しかし、考えてみればargcを使わんでも配列のサイズをフラグにすればいいか。
で、配列のサイズを使うならついでに番兵も削除。

s[80002],j;
main(c){
	while(j<3|*s<s[j]
		?c+=j++-2,s[j]=*s,~scanf("%d",s)
		:--j);
	printf("%u",c+2);
}

まぁこんなんで良いかな?
+2だとか-2だとか冗長そうなので短縮出来そうな気もする