C. Not Equal on a Segment(codeforces)

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 }

 

 

posted @ 2016-02-11 23:28  sCjTyC  阅读(595)  评论(0编辑  收藏  举报