预处理每个位置前面所有数的运算和,以及后面所有数的运算和
查询时将前面和后面运算就是答案
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+10;
int andl[N],andr[N];
int orl[N],orr[N];
int xorl[N],xorr[N];
int a[N];
int main()
{
int n,q,m;
while(~scanf("%d%d",&n,&q))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
andl[2]=a[1];
andr[n-1]=a[n];
orl[2]=a[1];
orr[n-1]=a[n];
xorl[2]=a[1];
xorr[n-1]=a[n];
for(int i=2;i<n;i++)
{
andl[i+1]=andl[i]&a[i];
orl[i+1]=orl[i]|a[i];
xorl[i+1]=xorl[i]^a[i];
}
for(int i=n-1;i>1;i--)
{
andr[i-1]=andr[i]&a[i];
orr[i-1]=orr[i]|a[i];
xorr[i-1]=xorr[i]^a[i];
}
while(q--)
{
scanf("%d",&m);
int ans1,ans2,ans3;
ans1=andl[m]&andr[m];
ans2=orl[m]|orr[m];
ans3=xorl[m]^xorr[m];
if(m==1)
{
ans1=andr[m];
ans2=orr[m];
ans3=xorr[m];
}
if(m==n)
{
ans1=andl[m];
ans2=orl[m];
ans3=xorl[m];
}
printf("%d %d %d\n",ans1,ans2,ans3);
}
}
return 0;
}