Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN (int)(2*1e5 + 1)
- #define F first
- #define S second
- #define endl "\n"
- #define MOD (lli)(1e9 + 7)
- #define lli long long int
- #define sz(a) int(a.size())
- #define DEBUG if(0) cout << "aqui" << endl;
- #define PI 2 * acos(0.0)
- typedef pair<int,int> ii;
- int dx[] = {1, -1, 0, 0};
- int dy[] = {0, 0, 1, -1};
- int dddx[] = {1, -1, 0, 0, 1, 1, -1, -1};
- int dddy[] = {0, 0, 1, -1, 1, -1, 1, -1};
- int n, m;
- vector<int> vec(2*1010);
- vector<int> tree[8*1010];
- void build(int node = 1, int start = 1, int end = n){
- if(start == end){
- tree[node].push_back(vec[start]);
- return ;
- }
- int mid = (start + end) >> 1;
- build(2*node, start, mid);
- build(2*node+1, mid+1, end);
- tree[node].resize(sz(tree[2*node]) + sz(tree[2*node+1]));
- merge(tree[2*node].begin(), tree[2*node].end(), tree[2*node+1].begin(), tree[2*node+1].end(), tree[node].begin());
- }
- int query(int l, int r, int k, int node = 1, int start = 1, int end = n){
- if(start > r or end < l) return 0;
- if(start >= l and end <= r) {
- int idx2 = upper_bound(tree[node].begin(), tree[node].end(), k) - tree[node].begin();
- int idx = lower_bound(tree[node].begin(), tree[node].end(), k) - tree[node].begin();
- // cout << idx << " " << idx2 << endl;
- return (idx2 - idx);
- }
- int mid = (start + end) >> 1;
- int p1 = query(l, r, k, 2*node, start, mid);
- int p2 = query(l, r, k, 2*node+1, mid+1, end);
- return p1+p2;
- }
- int main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cin >> n >> m;
- for(int i=1;i<=n;i++) {
- int a;
- cin >> a;
- vec[i] = a%m;
- }
- int q;
- cin >> q;
- build();
- while(q--){
- int l, r, d;
- cin >> l >> r >> d;
- cout << query(l, r, d) << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement