Skip to content

Commit d840ac8

Browse files
authored
Create DQUERY.cpp
1 parent 2b15f15 commit d840ac8

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed

SPOJ/DQUERY.cpp

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
#define _CRT_SECURE_NO_WARNINGS
2+
#include <cstring>
3+
#include <map>
4+
#include <deque>
5+
#include <queue>
6+
#include <stack>
7+
#include <sstream>
8+
#include <numeric>
9+
#include <iostream>
10+
#include <iomanip>
11+
#include <cstdio>
12+
#include <cmath>
13+
#include <hash_map>
14+
#include <fstream>
15+
#include <string>
16+
#include <cstdlib>
17+
#include <ctime>
18+
#include <functional>
19+
#include <algorithm>
20+
#include <vector>
21+
#include <set>
22+
#include <complex>
23+
#include <list>
24+
#include <climits>
25+
#include <cctype>
26+
#include <bitset>
27+
using namespace std;
28+
29+
#define PI 3.14159265359
30+
#define all(v) v.begin(),v.end()
31+
#define sortva(v) sort(all(v))
32+
#define sortvd(v) sort(v.rbegin(),v.rend())
33+
#define sortaa(a,n) sort(a,a+n)
34+
#define sortad(a,n) sort(a,a+n),reverse(a,a+n)
35+
#define sfi1(v) scanf("%d",&v)
36+
#define sfi2(v1,v2) scanf("%d %d",&v1,&v2)
37+
#define sfi3(v1,v2,v3) scanf("%d %d %d",&v1,&v2,&v3)
38+
#define sfll1(v) scanf("%I64d",&v);
39+
#define sfll2(v1,v2) scanf("%I64d %I64d",&v1,&v2)
40+
#define sfll3(v1,v2,v3) scanf("%I64d %I64d %I64d",&v1,&v2,&v3)
41+
#define sfstr(v) scanf("%s", v);
42+
#define sz(v) v.size()
43+
#define ndl puts("")
44+
#define SS stringstream
45+
typedef long long ll;
46+
typedef unsigned long long ull;
47+
int dx[] = { 0, 0, 1, -1, 1, -1, 1, -1 };
48+
int dy[] = { 1, -1, 0, 0, -1, 1, 1, -1 };
49+
50+
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
51+
ll lcm(ll a, ll b) { return (a / gcd(a, b)) * b; }
52+
53+
void PLAY() {
54+
#ifndef ONLINE_JUDGE
55+
freopen("input.txt", "r", stdin);
56+
freopen("output.txt", "w", stdout);
57+
#endif
58+
cout << fixed << setprecision(10);
59+
ios::sync_with_stdio(0);
60+
cin.tie(0);
61+
cout.tie(0);
62+
}
63+
64+
const int MAX = (1 << 17);
65+
const int MAX2 = 2e5;
66+
67+
int BIT[MAX];
68+
69+
int get(int idx) {
70+
idx++;
71+
int ret = 0;
72+
while (idx) {
73+
ret += BIT[idx - 1];
74+
idx -= (idx & -idx);
75+
}
76+
return ret;
77+
}
78+
79+
void add(int idx, int val) {
80+
idx++;
81+
while (idx <= MAX) {
82+
BIT[idx - 1] += val;
83+
idx += (idx & -idx);
84+
}
85+
}
86+
87+
int nxt[MAX], res[MAX2 + 5];
88+
vector<pair<int, int>> query[MAX2 + 5];
89+
90+
int main() {
91+
PLAY();
92+
93+
int n;
94+
cin >> n;
95+
vector<int> v(n);
96+
map<int, int> mp;
97+
98+
for (int i = 0; i < n; i++) {
99+
cin >> v[i];
100+
auto it = mp.insert({ v[i], i }).first;
101+
if (it->second != i)
102+
nxt[it->second] = i;
103+
else
104+
add(i, 1);
105+
it->second = i;
106+
nxt[i] = -1;
107+
}
108+
109+
int q;
110+
cin >> q;
111+
112+
113+
for (int i = 0; i < q; i++) {
114+
int l, r;
115+
cin >> l >> r;
116+
query[--l].push_back({ --r, i });
117+
}
118+
119+
for (int i = 0; i < n; i++) {
120+
for (auto &p : query[i])
121+
res[p.second] = get(p.first);
122+
add(i, -1);
123+
if (nxt[i] != -1)
124+
add(nxt[i], 1);
125+
}
126+
for (int i = 0; i < q; i++)
127+
cout << res[i] << "\n";
128+
129+
return 0;
130+
}

0 commit comments

Comments
 (0)