神秘TLE
查看原帖
神秘TLE
1066818
tjtdrxxz楼主2024/7/3 21:36

莫名的T了,还没我用分块效率高。。。

# include <bits/stdc++.h>
# define int long long
#define stdi stdin
#define stdo stdout
using namespace std;
inline int read()
{
	char in = getchar(),f = 0; int t = 0;
	for(; !isdigit(in);in = getchar())if(!(in ^ 45)) f = 1;
	for(; in >= '0' && in <= '9';in = getchar())
	 t = (t << 1) + (t << 3) + (in ^ 48);
	return f ? -t : t;
}
inline void write(long long x)
{
	static int t[25]; int tp = 0;
	if(x == 0)return(void)(putchar('0'));
	else if(x < 0) putchar('-'),x = -x;
	while(x) t[tp++] = x % 10,x /= 10;
	while(tp--) putchar(t[tp] + '0');
}
const int N = 20000005;
int n = read (), m;
int a[N], last;
struct Node
{
	int l; int r;
	int ll; int rr;
	long long num;
	long long add;
}tree[N];
# define size chtholly
int size;
inline int add (int ind)
{
	tree[++ size] = tree[ind];
	return size;
}
inline void push (int ind)
{
	long long p1 = tree[tree[ind].ll].num;
	long long p2 = tree[tree[ind].rr].num;
	tree[ind].num = p1 + p2;
}
inline int build (int l, int r, int ind)
{
	ind = add (ind);
	tree[ind].l = l;
	tree[ind].r = r;
	if(l == r)
	{
		tree[ind].num = 0;
		return ind;
	}
	int m1 = l + r >> 1; tree[ind].ll = build(l, m1, tree[ind].ll);
	int m2 = m1 * 1 + 1; tree[ind].rr = build(m2, r, tree[ind].rr);
	return ind;
}
inline int amend (int ind, int pos, int k)
{
	ind = add (ind);
	if (tree[ind].l == tree[ind].r)
	{
		tree[ind].num += k;
		return ind;
	}
	if (tree[tree[ind].ll].r >= pos) tree[ind].ll = amend (tree[ind].ll, pos, k);
	if (tree[tree[ind].rr].l <= pos) tree[ind].rr = amend (tree[ind].rr, pos, k);
	push (ind);
	return ind;
}
# define L tree[ind].l
# define R tree[ind].r
inline int find (int ind, int l, int r)
{
	if (tree[ind].l >= l and tree[ind].r <= r)
	{
		return tree[ind].num;
	}
	int ret = 0;
	if (tree[tree[ind].ll].r >= l) ret += find (tree[ind].ll, l, r);
	if (tree[tree[ind].rr].l <= r) ret += find (tree[ind].rr, l, r);
	return ret;
}
int node[N], now;
int s[N], cnt;
int c[N];
signed main()
{
	setvbuf (stdi, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
	setvbuf (stdo, (char*) calloc (1 << 20, sizeof (char)), _IOFBF, 1 << 20);
	for (int i = 1; i <= n; i ++) a[i] = read (), s[++ cnt] = a[i];
	sort (1 + s, 1 + s + cnt);
	cnt = unique (s + 1, s + 1 + cnt) - s - 1;
	node[0] = build (1, n, 1);
	for (int i = 1; i <= n; i ++)
	{
		c[i] = lower_bound (s + 1, s + 1 + cnt, a[i]) - s;
		node[i] = amend (node[i - 1], c[i], a[i]);
	}
	last = 0;
	m = read ();
	while (m --)
	{
		int l = read (), r = read (), k = read ();
		l ^= last, r ^= last, k ^= last;
		int back = upper_bound (s + 1, s + 1 + cnt, k) - s - 1;
		if (l > r) swap (l, r);
		if (!k)
		{
			last = 0;
		}
		else
		{
			last = find (node[r], 1, back) - find (node[l - 1], 1, back);
		}
		write (last);
		puts("");
	}
}

2024/7/3 21:36
加载中...