Submission #990022

#TimeUsernameProblemLanguageResultExecution timeMemory
990022HishamAlshehriPoklon (COCI17_poklon)C++17
140 / 140
395 ms82100 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> using namespace std; //using namespace __gnu_pbds; #define int long long #define mod 1000000007 #define base 7001 #define base2 757 #define double long double //#define ordered_set tree<int, null_type, less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> #pragma GCC optimize("O3,Ofast,unroll-loops") #pragma GCC target("avx2,sse3,sse4,avx") constexpr int maxn = 500001; constexpr int N = 1 << (int)ceil(log2(maxn)); int n, q; int st[maxn]; int idx[maxn][3]; int a[maxn], temp[maxn], b[maxn]; vector<int>ans[maxn]; int tree[2 * N]; vector<int> range[maxn]; map<int,int>mp; int query(int l, int r, int nl, int nr, int i) { if (nl > r || nr < l) return 0; if (nl >= l && nr <= r) return tree[i]; int mid = (nl + nr) / 2; return query(l, r, nl, mid, i * 2) + query(l, r, mid + 1, nr, i * 2 + 1); } void update(int idx) { while (idx / 2) {tree[idx] = tree[idx * 2] + tree[idx * 2 + 1];idx /= 2;} return; } signed main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> q; for (int i = 0; i < n; i++) { cin >> a[i]; temp[i] = a[i]; } sort(temp, temp + n); int curr = 0; for (int i = 0; i < n; i++) { if (mp[temp[i]] == NULL) { mp[temp[i]] = curr; curr++; } } vector<int>v; while (q--) { int l, r; cin >> l >> r; l--; r--; v.push_back(r); range[r].push_back(l); } memset(idx, -1, sizeof idx); for (int i = 0; i < n; i++) { int state = 0; if (idx[a[i]][0] > -1) state++; if (idx[a[i]][1] > -1) state++; if (idx[a[i]][2] > -1) state++; if (!state) { idx[a[i]][0] = i; tree[i + N] = 0; update((i + N) / 2); } else if (state == 1) { idx[a[i]][1] = i; tree[idx[a[i]][1] + N] = 0; tree[idx[a[i]][0] + N] = 1; update((idx[a[i]][0] + N) / 2); update((idx[a[i]][1] + N) / 2); } else if (state == 2) { idx[a[i]][2] = i; tree[idx[a[i]][2] + N] = 0; tree[idx[a[i]][1] + N] = 1; tree[idx[a[i]][0] + N] = -1; update((idx[a[i]][0] + N) / 2); update((idx[a[i]][2] + N) / 2); update((idx[a[i]][1] + N) / 2); } else { tree[idx[a[i]][0] + N] = 0; update((idx[a[i]][0] + N) / 2); idx[a[i]][0] = idx[a[i]][1]; idx[a[i]][1] = idx[a[i]][2]; idx[a[i]][2] = i; tree[idx[a[i]][2] + N] = 0; tree[idx[a[i]][1] + N] = 1; tree[idx[a[i]][0] + N] = -1; update((idx[a[i]][0] + N) / 2); update((idx[a[i]][2] + N) / 2); update((idx[a[i]][1] + N) / 2); } for (int j : range[i]) { ans[i].push_back(query(j, i, 0, N - 1, 1)); } } for (int i = 0; i < v.size(); i++) { cout << ans[v[i]][st[v[i]]] << "\n"; st[v[i]]++; } }

Compilation message (stderr)

poklon.cpp: In function 'int main()':
poklon.cpp:60:28: warning: NULL used in arithmetic [-Wpointer-arith]
   60 |         if (mp[temp[i]] == NULL)
      |                            ^~~~
poklon.cpp:139:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |     for (int i = 0; i < v.size(); i++)
      |                     ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...