记录编号 |
351093 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]采花 |
最终得分 |
100 |
用户昵称 |
sxysxy |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
4.899 s |
提交时间 |
2016-11-16 10:26:16 |
内存使用 |
129.99 MiB |
显示代码纯文本
//%%%%膜拜想出建两棵树的大神犇们
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <list>
#include <queue>
#include <vector>
using namespace std;
#define MAXN 200001
struct node
{
int ls, rs;
int cnt;
}ns[MAXN*55+1];
int last = 1;
int build(int l, int r)
{
if(l > r)return 0;
int c = last++;
node &d = ns[c];
if(l == r)return c;
else
{
int m = (l+r)>>1;
d.ls = build(l, m);
d.rs = build(m+1, r);
}
return c;
}
int insert(int base, int l, int r, int v)
{
int c = last++;
ns[c] = ns[base];
if(l == r && l == v)
{
ns[c].cnt++;
return c;
}
else
{
int m = (l+r)>>1;
if(v <= m)ns[c].ls = insert(ns[base].ls, l, m, v);
else ns[c].rs = insert(ns[base].rs, m+1, r, v);
ns[c].cnt = ns[ns[c].ls].cnt + ns[ns[c].rs].cnt;
}
return c;
}
int query(int pre, int cur, int l, int r, int ql, int qr)
{
if(ql <= l && r <= qr)
return ns[cur].cnt-ns[pre].cnt;
int res = 0;
int m = (l+r)>>1;
if(ql <= m)res += query(ns[pre].ls, ns[cur].ls, l, m, ql, qr);
if(m < qr)res += query(ns[pre].rs, ns[cur].rs, m+1, r, ql, qr);
return res;
}
int root[MAXN*2+2];
int col[MAXN];
int prev1[MAXN];
int prev2[MAXN];
int main()
{
freopen("flower++.in", "r", stdin);
freopen("flower++.out", "w", stdout);
int n, c, q;
scanf("%d %d %d", &n, &c, &q);
for(int i = 1; i <= n; i++)
scanf("%d", col+i);
root[0] = build(1, n);
root[n+1] = build(1, n);
for(int i = 1; i <= n; i++)
{
int v = col[i];
if(prev1[v])
root[i] = insert(root[i-1], 1, n, prev1[v]);
else root[i] = root[i-1];
if(prev2[v])
root[n+i+1] = insert(root[n+i], 1, n, prev2[v]);
else root[n+i+1] = root[n+i];
prev2[v] = prev1[v];
prev1[v] = i;
}
int ans = 0;
while(q--)
{
int l, r;
scanf("%d %d", &l, &r);
l ^= ans; r ^= ans;
ans = query(root[l-1], root[r], 1, n, l, r);
ans -= query(root[n+l], root[n+r+1], 1, n, l, r);
printf("%d\n", ans);
}
return 0;
}