1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll;
const int N = 1e6+10; int n, m; int a[N]; ll sum[N]; int last[N], pos[N];
int mx[N*4];
void change(int k1) { mx[k1] = max(mx[k1*2], mx[k1*2+1]); return; } void buildtree(int k1, int l, int r) { if(l == r) { mx[k1] = last[l]; return; } int mid = l+r >> 1; buildtree(k1*2, l, mid); buildtree(k1*2+1, mid+1, r); change(k1); }
int Find(int k1, int l, int r, int L, int R) { if(l > R || r < L) return 0; if(L <= l && r <= R) { return mx[k1]; } int mid = l+r >> 1; return max(Find(k1*2, l, mid, L, R), Find(k1*2+1, mid+1, r, L, R)); }
int main() { while(scanf("%d%d", &n, &m) != EOF) { memset(pos, 0, sizeof(pos)); memset(last, 0, sizeof(last)); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum[i] = sum[i-1] + a[i]; last[i] = pos[a[i]]; pos[a[i]] = i; } buildtree(1, 1, n); int l, r; while(m--) { scanf("%d%d", &l, &r); int len = r-l+1; if( (sum[r] - sum[l-1] == len*(len+1)/2) && (Find(1, 1, n, l, r) < l)) { printf("YES\n"); } else printf("NO\n"); } } return 0; }
|