#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int MAXN = 8000 + 10;
struct Tree
{
int l, r;
int val;
}tree[MAXN<<2];
int color[MAXN];
void build(int l, int r,int rt)
{
tree[rt].l = l;
tree[rt].r = r;
tree[rt].val = -1;
if(l == r) return ;
int m = (l + r) >> 1;
build(l, m, rt<<1);
build(m + 1, r, rt<<1|1);
}
void update(int l, int r, int c, int rt)
{
if(tree[rt].l == l && tree[rt].r == r)
{
tree[rt].val = c;
return ;
}
if(tree[rt].val != -1)
{
tree[rt<<1].val = tree[rt].val;
tree[rt<<1|1].val = tree[rt].val;
tree[rt].val = -1;
}
int m = (tree[rt].l + tree[rt].r) >> 1;
if(r <= m) update(l, r, c, rt<<1);
else if(l > m) update(l, r, c, rt<<1|1);
else
{
update(l, m, c, rt<<1);
update(m + 1, r, c, rt<<1|1);
}
}
int ans[MAXN];
void Query(int rt, int l, int r)
{
if(tree[rt].l == tree[rt].r)
{
ans[l] = tree[rt].val;
return ;
}
int m = (l + r) >> 1;
if(tree[rt].val != -1)
{
tree[rt<<1].val = tree[rt<<1|1].val = tree[rt].val;
tree[rt].val = -1;
}
Query(rt<<1, l, m);
Query(rt<<1|1, m + 1, r);
}
int main()
{
int N;
while(scanf("%d", &N)!=EOF)
{
int l, r, val;
int M = 0;
build(1, 8001, 1);
for(int i=1;i<=N;i++)
{
scanf("%d%d%d", &l, &r, &val);
if(l > r) swap(l, r);
update(l+1, r, val, 1);
M = max(M, val);
}
memset(color, 0, sizeof(color));
memset(ans, -1, sizeof(ans));
Query(1, 1, 8001);
for(int i=1;i<=8001;i++)
{
if(ans[i] != -1 && ans[i] != ans[i-1])
color[ans[i]]++;
}
for(int i=0;i<=8001;i++) if(color[i])
printf("%d %d\n", i, color[i]);
printf("\n");
}
return 0;
}
ZOJ 1610
最新推荐文章于 2020-07-30 13:04:51 发布