제출 #290500

#제출 시각아이디문제언어결과실행 시간메모리
290500luciocfSegments (IZhO18_segments)C++14
16 / 100
272 ms12280 KiB
#include <bits/stdc++.h>

#define ff first
#define ss second

using namespace std;

typedef pair<int, int> pii;

const int maxn = 1e5+10;
const int maxv = 2e9+10;

struct Node
{
    int v, w, sz;
    Node *l, *r;

    Node(int vv)
    {
        v = vv, sz = 1, w = rand();
        l = r = NULL;
    }
};

typedef Node*& Node_t;

Node *root[2];

struct Treap
{
	int sz(Node *t) {return (t ? t->sz : 0);}

	void op(Node *t)
	{
	    if (t) t->sz = sz(t->l) + sz(t->r) + 1;
	}

	void split(Node *t, Node_t l, Node_t r, int v)
	{
	    if (!t) return void(l=r=NULL);

	    if (t->v > v) split(t->l, l, t->l, v), r = t;
	    else split(t->r, t->r, r, v), l = t;

	    op(t);
	}

	void merge(Node_t t, Node *l, Node *r)
	{
	    if (!l || !r) t = (l ? l : r);
	    else if (l->w > r->w) merge(l->r, l->r, r), t = l;
	    else merge(r->l, l, r->l), t = r;

	    op(t);
	}

	void insert(Node_t t, int v)
	{
		Node *aux = new Node(v);
		Node *t1, *t2;

		split(t, t1, t2, v);
		merge(t1, t1, aux);
		merge(t, t1, t2);

		op(t);
	}

	void erase(Node_t t, int v)
	{
	    if (t->v == v) merge(t, t->l, t->r);
	    else erase((v > t->v ? t->r : t->l), v);

	    op(t);
	}

	int get_menor(Node *t, int v)
	{
		if (!t) return 0;

		if (t->v >= v) return get_menor(t->l, v);
		return sz(t->l)+1+get_menor(t->r, v);
	}

	int get_maior(Node *t, int v)
	{
		if (!t) return 0;

		if (t->v <= v) return get_maior(t->r, v);
		return sz(t->r)+1+get_maior(t->l, v);
	}
} T;

pii range[maxn];

int main(void)
{
	int q, t;
	scanf("%d %d", &q, &t);

	int lastans = 0;
	int ind = 0, qtd_ativo = 0;

	root[0] = root[1] = NULL;

	while (q--)
	{	
		int op;
		scanf("%d", &op);

		if (op == 1)
		{
			int l, r;
			scanf("%d %d", &l, &r);

			l = (l ^ (t*lastans));
			r = (r ^ (t*lastans));
			if (l > r) swap(l, r);

			range[++ind] = {l, r};
			++qtd_ativo;

			T.insert(root[0], l);
			T.insert(root[1], r);
		}
		else if (op == 2)
		{
			int x;
			scanf("%d", &x);

			--qtd_ativo;

			T.erase(root[0], range[x].ff);
			T.erase(root[1], range[x].ss);
		}
		else
		{
			int l, r, k;
			scanf("%d %d %d", &l, &r, &k);

			l = (l ^ (t*lastans));
			r = (r ^ (t*lastans));
			if (l > r) swap(l, r);

			lastans = qtd_ativo - T.get_menor(root[1], l) - T.get_maior(root[0], r);
			printf("%d\n", lastans);
		}
	}
}

컴파일 시 표준 에러 (stderr) 메시지

segments.cpp: In function 'int main()':
segments.cpp:99:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   99 |  scanf("%d %d", &q, &t);
      |  ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:109:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  109 |   scanf("%d", &op);
      |   ~~~~~^~~~~~~~~~~
segments.cpp:114:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  114 |    scanf("%d %d", &l, &r);
      |    ~~~~~^~~~~~~~~~~~~~~~~
segments.cpp:129:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  129 |    scanf("%d", &x);
      |    ~~~~~^~~~~~~~~~
segments.cpp:139:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  139 |    scanf("%d %d %d", &l, &r, &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...