C. Not Equal on a Segment
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given array a with n integers and m queries. The i-th query is given with three integers li, ri, xi.
For the i-th query find any position pi (li ≤ pi ≤ ri) so that api ≠ xi.
Input
The first line contains two integers n, m (1 ≤ n, m ≤ 2·105) — the number of elements in a and the number of queries.
The second line contains n integers ai (1 ≤ ai ≤ 106) — the elements of the array a.
Each of the next m lines contains three integers li, ri, xi (1 ≤ li ≤ ri ≤ n, 1 ≤ xi ≤ 106) — the parameters of the i-th query.
Output
Print m lines. On the i-th line print integer pi — the position of any number not equal to xi in segment [li, ri] or the value - 1 if there is no such number.
Sample test(s)
input
6 4
1 2 1 1 3 5
1 4 1
2 6 2
3 4 1
3 4 2
output
2
6
-1
4
思路:求要询问的区间的最大和最小数,求出它们的下标,和所问的数比较,如果两个都和之相等则在这个区间无和他不同的,否则取最大和最小与之不同的下标即可,用线段树去维护每个区间最大最小值
复杂度为(n*logn);
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<math.h> 7 #include<cstdio> 8 #include<queue> 9 #include<stack> 10 #include<map> 11 int ask(int l,int r,int aa,int bb,int k); 12 int ask1(int l,int r,int aa,int bb,int k); 13 void build(int l,int r,int k); 14 using namespace std; 15 typedef long long ll; 16 int tree[1000000]; 17 int tree2[1000000]; 18 int a[400005]; 19 int main(void) 20 { 21 int i,j,k,p,q; 22 tree[0]=0; 23 int nn,mm,kk; 24 while(scanf("%d %d",&p,&q)!=EOF) 25 { 26 for(i=1; i<=p; i++) 27 { 28 scanf("%d",&a[i]); 29 } 30 build(1,p,0); 31 while(q--) 32 { 33 scanf("%d %d %d",&nn,&mm,&kk); 34 a[0]=0; 35 int maxxid=ask(nn,mm,1,p,0); 36 a[0]=1e8; 37 int minnid=ask1(nn,mm,1,p,0); 38 int maxx=a[maxxid]; 39 int minn=a[minnid]; 40 if(kk==maxx&&kk==minn) 41 { 42 printf("-1\n"); 43 } 44 else 45 { 46 if(kk!=maxx) 47 { 48 printf("%d\n",maxxid); 49 } 50 else printf("%d\n",minnid); 51 } 52 } 53 } 54 return 0; 55 } 56 57 void build(int l,int r,int k) 58 { 59 if(l==r) 60 { 61 tree[k]=l; 62 tree2[k]=l; 63 return ; 64 } 65 else 66 { 67 build(l,(l+r)/2,2*k+1); 68 build((l+r)/2+1,r,2*k+2); 69 tree[k]=a[tree[2*k+1]]>a[tree[2*k+2]]?tree[2*k+1]:tree[2*k+2]; 70 tree2[k]=a[tree2[2*k+1]]<a[tree2[2*k+2]]?tree2[2*k+1]:tree2[2*k+2]; 71 } 72 } 73 int ask(int l,int r,int aa,int bb,int k) 74 { 75 if(l>bb||r<aa) 76 { 77 return 0; 78 } 79 else if(l<=aa&&r>=bb) 80 { 81 return tree[k]; 82 } 83 else 84 { 85 int ll=ask(l,r,aa,(aa+bb)/2,2*k+1); 86 int uu=ask(l,r,(aa+bb)/2+1,bb,2*k+2); 87 return a[ll]>a[uu]?ll:uu; 88 } 89 90 } 91 int ask1(int l,int r,int aa,int bb,int k) 92 { 93 if(l>bb||r<aa) 94 { 95 return 0; 96 } 97 else if(l<=aa&&r>=bb) 98 { 99 return tree2[k]; 100 } 101 else 102 { 103 int ll=ask1(l,r,aa,(aa+bb)/2,2*k+1); 104 int uu=ask1(l,r,(aa+bb)/2+1,bb,2*k+2); 105 return a[ll]<a[uu]?ll:uu; 106 } 107 }