Submission #385597

#TimeUsernameProblemLanguageResultExecution timeMemory
385597patrikpavic2Segments (IZhO18_segments)C++17
100 / 100
3358 ms13000 KiB
#include <cstdio>
#include <vector>
#include <algorithm>

#define PB push_back

using namespace std;

const int N = 2e5 + 500;
const int INF = 0x3f3f3f3f;
const int BUK = 2000;
const int UPD = 2000;

int un[N], n, vel, L[N], R[N], lg2[N];
int br_buk = 0, mi[N], mx[N], q;
int po_L[N], po_R[N], sz[N];

bool cmp_len(int x, int y){
	return R[x] - L[x] < R[y] - L[y];
}

bool cmpL(int x, int y){
	return L[x] > L[y];
}

bool cmpR(int x, int y){
	return R[x] < R[y];
}

int losihL(int *v, int x, int vel){
	int ret = -1;
	for(int i = lg2[vel];i >= 0;i--){
		if(ret + (1 << i) < vel && L[v[ret + (1 << i)]] > x)
			ret += (1 << i);
	}
	return ret + 1;
}

int losihR(int *v, int x, int vel){
	int ret = -1;
	for(int i = lg2[vel];i >= 0;i--){
		if(ret + (1 << i) < vel && R[v[ret + (1 << i)]] < x)
			ret += (1 << i);
	}
	return ret + 1;
}

vector < int > svi;
vector < int > pos_ubac, pos_izbac;



void rebuild(){
	vector < int > nov;
	sort(pos_ubac.begin(), pos_ubac.end(), cmp_len);
	int i = 0, j = 0;
	for(;i < (int)svi.size() || j < (int)pos_ubac.size();){
		int nxt = 0;
		if(i == (int)svi.size()) nxt = pos_ubac[j++];
		else if(j == (int)pos_ubac.size()) nxt = svi[i++];
		else if(cmp_len(svi[i], pos_ubac[j])) nxt = svi[i++];
		else nxt = pos_ubac[j++];
		if(un[nxt]) nov.PB(nxt);
	}
	pos_ubac.clear(); pos_izbac.clear();
	svi = nov;
	//printf("SVI = %d\n", (int)svi.size());
	for(int i = 0;i < br_buk;i++){
		mi[i] = INF, mx[i] = -INF; sz[i] = 0;
	}
	int cur = 0; br_buk = 0;
	for(int x : svi){
		//printf("%d %d\n", L[x], R[x]);
		po_L[cur] = x;
		po_R[cur] = x;
		sz[cur / BUK]++;
		mi[cur / BUK] = min(mi[cur / BUK], R[x] - L[x]);
		mx[cur / BUK] = max(mx[cur / BUK], R[x] - L[x]);
		br_buk = (cur++) / BUK + 1;
	}
	for(int i = 0;i < br_buk;i++){
		sort(po_L + i * BUK, po_L + i * BUK + sz[i], cmpL);
		sort(po_R + i * BUK, po_R + i * BUK + sz[i], cmpR);
	}
}

int l, r, k;

bool dobar(int x){
	return L[x] <= r - k && R[x] >= l + k && R[x] - L[x] >= k;
}

int main(){
	for(int i = 0;i < N;i++){
		while((1 << lg2[i]) <= i) lg2[i]++;
		lg2[i]--;
	}
	int T; scanf("%d%d", &q, &T);
	int sol = 0;
	for(;q--;){
		if(q % UPD == 0){
			rebuild();
		}
		int ty; scanf("%d", &ty);
		if(ty == 1){
			int l, r; scanf("%d%d", &l, &r);
			l = (l ^ (T * sol)), r = (r ^ (T * sol));
			if(l > r) swap(l, r);
			L[vel] = l, R[vel] = r; un[vel] = 1;
			pos_ubac.PB(vel); vel++;
		}
		if(ty == 2){
			int x; scanf("%d", &x);
			pos_izbac.PB(x - 1); un[x - 1] = 0;
		}
		if(ty == 3){
			scanf("%d%d%d", &l, &r, &k); k--;
			l = (l ^ (T * sol)), r = (r ^ (T * sol)); sol = 0;
			if(l > r) swap(l, r);
			if(r - l < k){
				printf("%d\n", sol);
				continue;
			}
			for(int i = 0;i < br_buk;i++){
				if(mx[i] < k) continue;
				if(mi[i] >= k){
					//printf("sol += %d - %d - %d\n", (int)po_L[i].size(), losihL(po_L[i], r - k), losihR(po_R[i], l + k));
					//sol += (int)po_L[i].size() - losihL(po_L[i], r - k) - losihR(po_R[i], l + k);
					sol += sz[i];
					sol -= losihL(po_L + i * BUK, r - k, sz[i]);
					sol -= losihR(po_R + i * BUK, l + k, sz[i]);
				}
				else{
					for(int j = 0;j < sz[i];j++) sol += dobar(po_L[i * BUK + j]);
				}
			}
			for(int x : pos_ubac) sol += dobar(x);
			for(int x : pos_izbac) sol -= dobar(x);
			printf("%d\n", sol);
		}

	}
	return 0;
}

Compilation message (stderr)

segments.cpp: In function 'int main()':
segments.cpp:98:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   98 |  int T; scanf("%d%d", &q, &T);
      |         ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:104:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  104 |   int ty; scanf("%d", &ty);
      |           ~~~~~^~~~~~~~~~~
segments.cpp:106:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  106 |    int l, r; scanf("%d%d", &l, &r);
      |              ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:113:16: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  113 |    int x; scanf("%d", &x);
      |           ~~~~~^~~~~~~~~~
segments.cpp:117:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  117 |    scanf("%d%d%d", &l, &r, &k); k--;
      |    ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...