题意:给一个长度为n的数组a,每次询问区间内是否存在和不同的数,如果存在则输出一个下标,否则输出-1。
题解:想了想似乎在线/离线都不是很好搞,看了一眼题解也是绝了。记一个表示从第i位往右第一个与i不同的数。每次询问如果则直接输出,否则根据和的大小关系输出或者-1。复杂度为。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=2e5+4;
int n,m;
int a[N],nxt[N];
inline int read() {
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
int main() {
n=read(),m=read();
for (register int i=1;i<=n;++i) a[i]=read();
nxt[n]=INF;
for (register int i=n-1;i;--i) {
if (a[i]==a[i+1]) nxt[i]=nxt[i+1];
else nxt[i]=i+1;
}
while (m--) {
int l=read(),r=read(),x=read();
if (a[l]^x) printf("%d\n",l);
else if (nxt[l]<=r) printf("%d\n",nxt[l]);
else puts("-1");
}
return 0;
}