// 11212312341234512345612345671234567812345678912345678910123456789101112345678910......
// 给你个n 求上面的序列第n个数字是多少
// 我是先按尾巴数字位数分组
// 定义如下数据结构
// 然后在求在确定位数里面的第几个
// 再求这个子序列里面的某一位
// 就是分组 归类的思想
// 1Y ,看来思路清晰,代码清晰对于准确率来说是满重要,以前老是迷迷糊糊就开始写代码
#include <iostream>
#include <string>
#include<sstream>
#include <cmath>
#include <map>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
/*
结束的数值 个数 长度范围
1 9 9 1 9 1位
10 99 90 11 189 2位
100 999 900 .....
1000 9999 9000 .....
10000 99999 90000 .....
*/
struct node
{
int len; //位数
int num; //个数
LL l,r; //长度区间
LL sum; //长度和
}st[10];
int GetAns(int index,LL n)
{
LL x=st[index].l;
while(n>x)
{
n-=x;
x+=index;
}
int len[10],start[10],num[10];
len[1]=9;start[1]=1;num[1]=9;
int i;
for(i=2;i<=5;i++)
{
num[i]=num[i-1]*10;
len[i]=i*num[i];
start[i]=start[i-1]*10;
}
i=1;
while(n)
{
if(n>len[i])
{
n-=len[i];
i++;
}
else
break;
}
int k=start[i]+n/i;
int stack[10],j;
if(n%i==0)
{
k--;
return k%10;
}
else
{
k++;
i=n%i;
j=0;
while(k)
{
stack[j++]=k%10;
k/=10;
}
while(i--)
{
j--;
}
return stack[j];
}
}
int main()
{
st[1].len=1;st[1].num=9;
st[1].l=1;st[1].r=9;
st[1].sum=(1+9)*9/2;
int i;
for(i=2;i<=5;i++)
{
st[i].len=i;st[i].num=st[i-1].num*10;
st[i].l=st[i-1].r+i;
st[i].r=st[i-1].r+i*st[i].num;
st[i].sum=(st[i].l+st[i].r)*st[i].num/2;
}
// for(i=1;i<=5;i++)
// printf("%d %d %lld %lld %lld
",st[i].len,st[i].num,st[i].l,st[i].r,st[i].sum);
int t;
LL n;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
for(i=1;i<=5;i++)
{
if(n>st[i].sum)
n-=st[i].sum;
else
break;
}
printf("%d
",GetAns(i,n));
}
return 0;
}