Codeforces 622 C 세그먼트 에 같 지 않 음 (선분 수)

제목 링크:
http://codeforces.com/contest/622/problem/C
제목 의 대의:
n 으로 긴 서열, m 개 질문 을 드 립 니 다.매번 한 구간 [l, r] 과 수 x 를 묻는다.이 구간 안에 x 가 아 닌 임의의 위 치 를 물 어보 세 요.
범위:
n,m<=2*10^5。
생각:
선분 수 를 고려 할 수 있 습 니 다.선분 트 리 를 이용 하여 구간 의 최대 값 과 최소 값 을 유지 합 니 다.물 어 볼 때마다 현재 구간 의 최대 값 과 최소 값 이 x 와 다 르 는 지, 다 르 면 왼쪽 트 리 를 먼저 보 세 요. 왼쪽 트 리 위의 최대 최소 값 이 x 와 같다 면 오른쪽 트 리 를 보 세 요.잎 이 맺 힐 때 까지 답 이다. 그렇지 않 으 면 - 1 이다.
코드:
#include
#include
#include
#include
#define M 200005
using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
int min(int a,int b)
{
    return a>1;
    if(l==r){
        tree[i].ma=tree[i].mi=a[tree[i].l];
        return;
    }
    build(l,mid,i<<1);
    build(mid+1,r,i<<1|1);
    pushup(i);
    return;
}
int ans,f;
void query(int l,int r,int i,int z)
{
 if(f)return;
    if(tree[i].l==tree[i].r){
        if(tree[i].ma!=z){f=1;ans=tree[i].l;}
        else ans=-1;
        return;
    }
             int mid=tree[i].l+tree[i].r>>1;
    if(tree[i].ma!=z||tree[i].mi!=z){
         if(r<=mid)query(l,r,i<<1,z);
    else if(l>mid) query(l,r,i<<1|1,z);
  else {
    query(l,mid,i<<1,z);
    query(mid+1,r,i<<1|1,z);
    }


  }
  else {
    ans=-1;
  }
}
int main()
{
    int i,j,k,l,r,m,x;
    while(~(scanf("%d%d",&n,&m)))
    {
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
            build(1,n,1);
            while(m--)
            {
                f=0;
                scanf("%d%d%d",&l,&r,&x);
                query(l,r,1,x);
                       printf("%d
",ans); } } }

좋은 웹페이지 즐겨찾기