用前缀和, 搞出上边界和下边界.询问的时候二分
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<int, int>
#define MP make_pair
#define ls i << 1
#define rs ls | 1
#define md (ll + rr >> 1)
#define inf 0x3f3f3f3f
#define mod 1000000007
#define N 1000020
#define M 500020
int n, m, f0[N], f1[N], x[N];
pii low[N], upp[N];
int c1, c2;
void prepare(){
for(int i = 1; i <= n; ++i){
if(i & 1) f0[i] = f0[i-1] + x[i], f1[i] = f1[i-1];
else f0[i] = f0[i-1], f1[i] = f1[i-1] + x[i];
}
int t1 = 0, t2 = 0;
for(int i = 1; i <= n; ++i){
for(int j = i; j <= n; ++j){
if((i & 1) && (j & 1))
low[t1++] = MP(f0[j] - f0[i-1], f1[j] - f1[i-1]);
if(!(i & 1) && !(j & 1))
upp[t2++] = MP(f0[j] - f0[i-1], f1[j] - f1[i-1]);
}
}
sort(low, low + t1);
sort(upp, upp + t2);
c1 = 0, c2 = 0;
for(int i = 0; i < t1; ++i){
if(i > 0 && low[i].first == low[c1-1].first && low[i].second >= low[c1-1].second) continue;
while(c1 > 0 && low[i].second <= low[c1-1].second) c1--;
low[c1++] = low[i];
}
for(int i = 0; i < t2; ++i){
if(i > 0 && upp[i].first == upp[c2-1].first && upp[i].second <= upp[c2-1].second) continue;
if(!c2 || c2 > 0 && upp[i].second > upp[c2-1].second)
upp[c2++] = upp[i];
}
}
int main(){
int cas;
scanf("%d", &cas);
while(cas--){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
scanf("%d", &x[i]);
prepare();
int a, b;
while(m--){
scanf("%d%d", &a, &b);
int L = lower_bound(low, low + c1, MP(a, -inf)) - low;
int R = lower_bound(upp, upp + c2, MP(a, inf)) - upp;
if(L < c1 && b >= low[L].second && b <= upp[R-1].second) putchar('1');
else putchar('0');
}
puts("");
}
return 0;
}