记录编号 616224 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 3986.水母序列 最终得分 100
用户昵称 Gravatarxuyuqing 是否通过 通过
代码语言 C++ 运行时间 7.270 s
提交时间 2026-06-02 19:31:15 内存使用 37.30 MiB
显示代码纯文本
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>
 
using namespace std;
 
const int N = 100010;
const int M = 1000010;
const int Bit = 20;
const int Maxn = (1 << 20) + 10;
 
class fastIn {
	private:
	
	char buf [1 << 20];
	char *p1 = buf;
	char *p2 = buf;
	
	inline char getch ();
	
	public:
	
	template <typename NumT>
	void read (NumT &num);
	
	template <typename NumT>
	fastIn& operator >> (NumT &num);
};
 
inline char fastIn::getch () {
	if (p1 == p2) {
		p1 = buf;
		p2 = buf + fread (buf, 1, 1 << 20, stdin);
		if (p1 == p2) {
			return EOF;
		}
	}
	return *p1++;
}
 
template <typename NumT>
void fastIn::read (NumT &num) {
	char ch = getch ();
	NumT op = 1;
	num = 0;
	
	while (ch < '0' || '9' < ch) {
		op = ((ch == '-') ? -1 : 1);
		ch = getch ();
	}
	while ('0' <= ch && ch <= '9') {
		num *= 10;
		num += (ch - '0');
		ch = getch ();
	}
	
	num *= op;
}
 
template <typename NumT>
fastIn& fastIn::operator >> (NumT &num) {
	read (num);
	return *this;
}
 
fastIn fin;

namespace Fenwick_Tree {
	inline int lowbit (int id) {
		return (id) & (-id);
	}
	
	void update (int id, long long num, long long tree[N]) {
		for (; id < N; id += lowbit (id)) {
			tree[id] += num;
		}
	}
	
	long long query (int id, long long tree[N]) {
		long long res = 0;
		for (; id > 0; id -= lowbit (id)) {
			res += tree[id];
		}
		return res;
	}
}

namespace Segment_Tree_Based_On_Fenwick_Tree {
	long long diff[N];
	long long multi_diff[N];
	
	void range_update (int l, int r, long long num) {
		using Fenwick_Tree::update;
		
		update (l, num, diff);
		update (r + 1, -num, diff);
		update (l, num * (l - 1), multi_diff);
		update (r + 1, -num * r, multi_diff);
	}
	
	long long single_query (int id) {
		using Fenwick_Tree::query;
		
		long long res1 = query (id, diff) * id;
		long long res2 = query (id, multi_diff);
		return res1 - res2;
	}
	
	long long range_query (int l, int r) {
		return single_query (r) - single_query (l - 1);
	}
}
 
bool flag[Maxn];
 
int n;
int m;
int nums[N];
pair<int, int> appear[N][Bit + 10];
pair<pair<int, int>, int> ques[M];
long long ress[M];
 
bool cmp (pair<pair<int, int>, int> one, pair<pair<int, int>, int> two) {
	return one.first.first < two.first.first;
}
 
int main () {
    
    freopen ("Jelly.in", "r", stdin);
    freopen ("Jelly.out", "w", stdout);
    
    flag[0] = flag[1] = true;
    for (int i = 2; i < Maxn; i++) {
        if (!flag[i]) {
            for (int j = i + i; j < Maxn; j += i) {
                flag[j] = true;
            }
        }
    }
    
	fin >> n >> m;
    for (int i = 1; i <= n; i++) {
		fin >> nums[i];
    }
 
    for (int i = 0; i < Bit; i++) {
        appear[n + 1][i] = {n + 1, i};
    }
    for (int i = n; i >= 1; i--) {
        for (int j = 0; j < Bit; j++) {
            if ((1 << j) & nums[i]) {
                appear[i][j] = {i, j};
            }
            else {
                appear[i][j] = appear[i + 1][j];
            }
        }
    }
 
    for (int i = 1; i <= m; i++) {
        int l, r;
		fin >> ques[i].first.first >> ques[i].first.second;
		ques[i].second = i;
    }
    sort (ques + 1, ques + 1 + m, cmp);
 
    int lastl = n + 1;
    using namespace Segment_Tree_Based_On_Fenwick_Tree;
    for (int index = m; index >= 1; index--) {
        auto [l, r] = ques[index].first;
        auto id = ques[index].second;
 
        for (int i = lastl - 1; i >= l; i--) {
            sort (appear[i], appear[i] + Bit);
            int now = 0;
            appear[i][Bit].first = n + 1;
            for (int j = 0; j < Bit; j++) {
                if (appear[i][j].first == n + 1) {
                    break;
                }
                now |= (1 << appear[i][j].second);
                if (appear[i][j].first != appear[i][j + 1].first) {
                    range_update(appear[i][j].first, appear[i][j + 1].first - 1, !flag[now]);
                }
            }
        }
 
        long long res = range_query(l, r);
        ress[id] = res;
        lastl = l;
    }
 
    for (int i = 1; i <= m; i++) {
        printf ("%lld\n", ress[i]);
    }
 
    return 0;
}