BestCoder Round #29 GTY's gay friends

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 100000+10;
int res[MAX<<2],ans[MAX],t[MAX];
int a[MAX],last[MAX];
struct node {
    int L,R,id,d;
    bool operator <(const node rhs) const {
        return R<rhs.R;
    }
}v[MAX];
void push_up(int o) {
   res[o]=max(res[o<<1],res[o<<1|1]);
}
void build(int L,int R,int o) {
    if(L==R) {
        res[o]=a[L];
        return ;
    }
    int mid=(L+R)>>1;
    build(L,mid,o<<1);
    build(mid+1,R,o<<1|1);
    push_up(o);
}
int Query1(int L,int R,int o,int ls,int rs) {
    if(ls<=L&&rs>=R) {
        return res[o];
    }

    int mid=(L+R)>>1;
    int tt=0;
    if(ls<=mid) tt=max(tt,Query1(L,mid,o<<1,ls,rs));
    if(rs>mid) tt=max(tt,Query1(mid+1,R,o<<1|1,ls,rs));
    return tt;
}
int sum[MAX];
int lowbit(int x) {
    return x&-x;
}
void modify(int pos,int val) {
    for(int i=pos;i<MAX;i+=lowbit(i)) {
        sum[i]+=val;
    }
}
int Query(int pos) {
    int res=0;
    for(int i=pos;i;i-=lowbit(i)) {
        res+=sum[i];
    }
    return res;
}
int main() {
    int n,m;
    while(scanf("%d %d",&n,&m)==2) {
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        for(int i=1;i<=m;i++) {
            scanf("%d %d",&v[i].L,&v[i].R) ;
            v[i].id=i;
            v[i].d=(v[i].R-v[i].L+1);
        }
        sort(v+1,v+1+m);
        memset(sum,0,sizeof(sum));
        memset(last,0,sizeof(last));
        int j=1;

        for(int i=1;i<=n;i++) {
            if(last[a[i]]) {
                modify(last[a[i]],-1);
            }
            modify(i,1);
            last[a[i]]=i;
            while(i==v[j].R&&j<=m) {

                ans[v[j].id]=Query(v[j].R)-Query(v[j].L-1);
              //  printf("%d %d %d ",ans[v[j].id],v[j].d,Query1(1,n,1,v[j].L,v[j].R));
                if(ans[v[j].id]==v[j].d&&Query1(1,n,1,v[j].L,v[j].R)==v[j].d) {
                    t[v[j].id]=1;
                }
                else t[v[j].id]=0;
                j++;
            }
        }
        for(int i=1;i<=m;i++) {
            if(t[i]) printf("YES ");
            else printf("NO ");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/acvc/p/4279701.html