Submission #610869

# Submission time Handle Problem Language Result Execution time Memory
610869 2022-07-28T16:50:16 Z racsosabe Poklon (COCI17_poklon) C++14
140 / 140
1179 ms 20604 KB
#include<bits/stdc++.h>
using namespace::std;

const int N = 500000 + 5;
const int bsize = 710;

int n;
int q;
int a[N];
int id[N];
int ans[N];
int cnt[N];
int L[N], R[N];

void compress(){
	set<int> S;
	for(int i = 1; i <= n; i++) S.emplace(a[i]);
	int len = 0;
	map<int, int> id;
	for(int x : S){
		id[x] = len++;
	}
	for(int i = 1; i <= n; i++) a[i] = id[a[i]];
}

void solve(){
	vector<int> queries(q);
	iota(queries.begin(), queries.end(), 1);
	sort(queries.begin(), queries.end(), [&] (int i, int j){
		if(id[i] == id[j]) return id[i] & 1 ? R[i] < R[j] : R[i] > R[j];
		return id[i] < id[j];
	});
	int cur = 0;
	int l = 1, r = 1;
	for(int at : queries){
		while(r <= R[at]){
			cnt[a[r]]++;
			if(cnt[a[r]] == 2) cur++;
			else if(cnt[a[r]] == 3) cur--;
			r += 1;
		}
		while(L[at] < l){
			l--;
			cnt[a[l]]++;
			if(cnt[a[l]] == 2) cur++;
			else if(cnt[a[l]] == 3) cur--;
		}
		while(l < L[at]){
			cnt[a[l]]--;
			if(cnt[a[l]] == 1) cur--;
			else if(cnt[a[l]] == 2) cur++;
			l++;
		}
		while(R[at] + 1 < r){
			r--;
			cnt[a[r]]--;
			if(cnt[a[r]] == 1) cur--;
			else if(cnt[a[r]] == 2) cur++;
		}
		ans[at] = cur;
	}
}

int main(){
	scanf("%d %d", &n, &q);
	for(int i = 1; i <= n; i++) scanf("%d", a + i);
	compress();
	for(int i = 1; i <= q; i++){
		scanf("%d %d", L + i, R + i);
		id[i] = L[i] / bsize;
	}
	solve();
	for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
	return 0;
}

Compilation message

poklon.cpp: In function 'int main()':
poklon.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |  scanf("%d %d", &n, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~
poklon.cpp:66:35: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |  for(int i = 1; i <= n; i++) scanf("%d", a + i);
      |                              ~~~~~^~~~~~~~~~~~~
poklon.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |   scanf("%d %d", L + i, R + i);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 2 ms 324 KB Output is correct
4 Correct 6 ms 452 KB Output is correct
5 Correct 139 ms 4032 KB Output is correct
6 Correct 143 ms 4120 KB Output is correct
7 Correct 354 ms 8276 KB Output is correct
8 Correct 592 ms 12472 KB Output is correct
9 Correct 839 ms 16464 KB Output is correct
10 Correct 1179 ms 20604 KB Output is correct