预处理p[i],p[i]表示:【p[i],i】这段闭区间上所有数字都是a[i]
询问的时候,如果xi==a[ri]并且p[ri]<=li,一定无解
剩下的情况都是有解的,如果xi!=a[ri],那么输出ri,否则输出p[ri]-1。
另外,看到有大牛博客说可以用线段树,大致是这样的:
线段树保存区间最大值与最小值,
如果询问的区间上最小值==最大值,那么无解;
剩下的情况都是有解;如果xi不等于最小值,那么输出最小值位置;如果xi不等于最大值,那么输出最大值位置。
#include <stdio.h> #include <algorithm> #include <string.h> #include <queue> #include <stack> #include <map> #include <vector> using namespace std; const int maxn=200000+10; int a[maxn],p[maxn]; int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); p[1]=1; for(int i=2;i<=n;i++) { if(a[i]==a[i-1]) p[i]=p[i-1]; else p[i]=i; } //p[i]表示,【p[i],i】这段闭区间上所有数字都是a[i] for(int i=1;i<=m;i++) { int li,ri,xi; scanf("%d%d%d",&li,&ri,&xi); if(xi==a[ri]&&p[ri]<=li) printf("-1\n"); else { if(xi!=a[ri]) printf("%d\n",ri); else printf("%d\n",p[ri]-1); } } return 0; }