#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 100005
int add[1025][11],res[1025][1025];
int val[MAX];
bool flag;
struct node
{
int lsta,rsta,sta;
int root;
} tree[MAX<<2];
inline int f(int x)
{
if(x%9==0) return x==0?0:9;
else return x%9;
}
void init()
{
memset(add,0,sizeof(add));
memset(res,0,sizeof(res));
for(int i=0; i<=1024; i++)
for(int j=0; j<=9; j++)
for(int k=0; k<=9; k++)
if(i&(1<<k))
add[i][j]|=(1<<f(k+j));
for(int i=0; i<=1024; i++)
for(int j=0; j<=1024; j++)
{
for(int k=0; k<=9; k++)
if(j&(1<<k))
res[i][j]|=add[i][k];
res[j][i]=res[i][j];
}
}
void update(node *tmp,node ls,node rs)
{
tmp->root=f(ls.root+rs.root);
tmp->lsta=ls.lsta|add[rs.lsta][ls.root];
tmp->rsta=rs.rsta|add[ls.rsta][rs.root];
tmp->sta=ls.sta|rs.sta|res[ls.rsta][rs.lsta];
}
void build(int rt,int l,int r)
{
if(l==r)
{
tree[rt].root=f(val[l]);
tree[rt].lsta=tree[rt].rsta=tree[rt].sta=1<<tree[rt].root;
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
update(&tree[rt],tree[rt<<1],tree[rt<<1|1]);
}
node query(int rt,int L,int R,int l,int r)
{
node tmp;
if(flag) return tmp;
if(L==l&&R==r)
{
if(tree[rt].sta>=992)
flag=1;
return tree[rt];
}
int mid=(L+R)>>1;
if(r<=mid) return query(rt<<1,L,mid,l,r);
else if(l>mid) return query(rt<<1|1,mid+1,R,l,r);
else
{
node ls=query(rt<<1,L,mid,l,mid);
if(flag) return tmp;
node rs=query(rt<<1|1,mid+1,R,mid+1,r);
if(flag) return tmp;
update(&tmp,ls,rs);
if(tmp.sta>=992) flag=1;
return tmp;
}
}
int main()
{
int T,n,Q,l,r;
init();
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
scanf("%d",&n);
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
build(1,1,n);
scanf("%d",&Q);
if(ca>1) puts("");
printf("Case #%d:\n",ca);
while(Q--)
{
scanf("%d%d",&l,&r);
flag=0;
int ans=query(1,1,n,l,r).sta;
if(flag) {printf("9 8 7 6 5\n");continue;}
int j=0;
for(int i=9;i>=0&&j<5;i--)
{
if(ans&(1<<i))
{
if(j==0) printf("%d",i);
else printf(" %d",i);
j++;
}
}
while(j<5)
{
if(j==0) printf("-1");
else printf(" -1");
j++;
}
puts("");
}
}
return 0;
}
HDU 4351 (线段树)
最新推荐文章于 2020-07-07 19:40:15 发布