脑补一个前缀和数组pre
对于给出的
[l,r]
的区间和的奇偶性:
若为odd(奇数):转化为
pre[r]
和
pre[l−1]
的奇偶性不同
若为even(偶数):转化为
pre[r]
和
pre[l−1]
的奇偶性相同
用并查集维护.
[1,n]
表示奇偶性相同,
[n+1,2∗n]
表示奇偶性不同
#include<cstdio>
#define N 100000
using namespace std;
int n,q,fa[N*2+5];
int gf(int x){return fa[x]==x?x:fa[x]=gf(fa[x]);}
int main(){
scanf("%d%d",&n,&q);
for(int i=0;i<=2*n;++i) fa[i]=i;
for(int i=1;i<=q;++i){
int l,r,fx1,fx2,fy1,fy2;char ch[10];
scanf("%d%d%s",&l,&r,ch);
fx1=gf(l-1),fx2=gf(l-1+n),fy1=gf(r),fy2=gf(r+n);
if(ch[0]=='e'){
if(fx1==fy2&&fx2==fy1) {printf("%d\n",i);return 0;}
fa[fx1]=fy1,fa[fx2]=fy2;
}
else{
if(fx1==fy1&&fx2==fy2) {printf("%d\n",i);return 0;}
fa[fx1]=fy2,fa[fx2]=fy1;
}
}
puts("-1");
return 0;
}