题目大意
给出n个数,共有n次询问,每次询问给出一个数p,求除去第p个数后的n-1个数的&、|、^值
解题思路
直接维护前缀和 后缀和
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int b[maxn];
int b1[maxn];
int c[maxn];
int c1[maxn];
int d[maxn];
int d1[maxn];
int main()
{
int n,q;
while(cin>>n>>q)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[1]=c[1]=d[1]=a[1];
for(int i=2;i<=n;i++)
{
b[i]=b[i-1]&a[i];
c[i]=c[i-1]|a[i];
d[i]=d[i-1]^a[i];
}
b1[n]=c1[n]=d1[n]=a[n];
for(int i=n-1;i>=1;i--)
{
b1[i]=b1[i+1]&a[i];
c1[i]=c1[i+1]|a[i];
d1[i]=d1[i+1]^a[i];
}
while(q--)
{
int m;
scanf("%d",&m);
if(m==1)
printf("%d %d %d\n",b1[m+1],c1[m+1],d1[m+1]);
else if(m==n)
printf("%d %d %d\n",b[m-1],c[m-1],d[m-1]);
else
printf("%d %d %d\n",b[m-1]&b1[m+1],c[m-1]|c1[m+1],d[m-1]^d1[m+1]);
}
}
return 0;
}