SRM302 div1 medium

ひどいソースだ。

#include <algorithm>
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <cstdio>

typedef long long LL;
using namespace std;

class IntegerPalindrome 
{
	public:

		LL findByIndex(int K) 
		{
			LL t[30],u[30];
			t[1]=t[2]=9;
			for(int i=3;i<30;i++)
				t[i]=t[i-2]*10;
			u[1]=0;
			for(int i=2;i<30;i++)
				u[i]=u[i-1]+t[i-1];
			int len;
			for(len=1;len<30;len++)
				if(u[len]<=K && K<u[len+1])
					break;
			K-=u[len];

			printf("len=%d K=%d\n",len,K);
			stringstream ss;
			ss << K;
			string s1=ss.str();

			printf("s1=%s\n",s1.c_str());

			if(len%2==0)
			{
				if(s1.size()*2<len)
					s1=string(len/2-s1.size(),'0')+s1;
				s1[0]+=1;
				printf("s1=%s\n",s1.c_str());
				string s2=s1;
				reverse(s1.begin(),s1.end());
				s2+=s1;
				printf("s2=%s\n",s2.c_str());

				stringstream tt(s2);
				LL l;
				tt>>l;
				return l;
			}
			else
			{
				if(s1.size()*2-1<len)
					s1=string(len/2-s1.size()+1,'0')+s1;
				s1[0]+=1;
				printf("s1=%s\n",s1.c_str());
				string s2=s1;
				reverse(s1.begin(),s1.end());
				s2+=s1.substr(1,s1.size()-1);
				printf("s2=%s\n",s2.c_str());
				stringstream tt(s2);
				LL l;
				tt>>l;
				return l;
			}
			return 0;
		}
};