链接
https://codeforces.com/problemset/problem/622/C
描述
给一个长度为n的数组(1下标)
进行q次询问,每次给出一个区间 [l,r] 和一个值 x ,找到区间中任意一个不等于x的元素的下标,没有输出-1
分析
直接离散可过,离散后至多查找两个元素就好,预处理一下每个元素所在区间ID甚至可以O(n)的搞出来,但是我比较懒,所以我弄了个比较好敲的nlogn
把每个和它前一位不一样的数的下标放到一个set里,询问时判断询问区间左端点是否符合要求,好久输出,不好就用左端点在set里跑upper,能跑到合法解就输出,不能就-1.
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 200000 + 10;
int nums[MAXN];
int n;
int main(void){
int q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",nums+i);
}
set<int> dfp;
dfp.insert(19260817);
for(int i=2;i<=n;i++){
if(nums[i] != nums[i-1])dfp.insert(i);
}
while(q--){
int s,e,val;
scanf("%d%d%d",&s,&e,&val);
if(nums[s] != val){
printf("%d\n",s);
}else{
int nxp = *(dfp.upper_bound(s));
printf("%d\n",((nxp>e)?(-1):(nxp)));
}
}
return 0;
}
才疏学浅,如有错误,欢迎指正。