cf C. Knight Tournament
http://codeforces.com/contest/357/problem/C
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 300010 5 using namespace std; 6 7 int n,m; 8 int l1,r1,x1; 9 struct node 10 { 11 int l,r; 12 int cover; 13 }tree[maxn*4]; 14 int x[maxn]; 15 16 void build(int i,int l,int r) 17 { 18 tree[i].l=l;tree[i].r=r; 19 tree[i].cover=0; 20 if(l==r) return ; 21 int mid=(l+r)>>1; 22 build(i<<1,l,mid); 23 build(i<<1|1,mid+1,r); 24 } 25 void down(int i) 26 { 27 if(tree[i].l==tree[i].r) return ; 28 if(tree[i].cover>0) 29 { 30 if(tree[i<<1].cover==0) 31 tree[i<<1].cover=tree[i].cover; 32 if(tree[i<<1|1].cover==0) 33 tree[i<<1|1].cover=tree[i].cover; 34 tree[i].cover=-1; 35 } 36 } 37 void update(int i,int l,int r,int co) 38 { 39 if(tree[i].l==l&&tree[i].r==r) 40 { 41 if(tree[i].cover==0) 42 { 43 tree[i].cover=co; 44 } 45 return ; 46 } 47 down(i); 48 int mid=(tree[i].l+tree[i].r)>>1; 49 if(r<=mid) 50 { 51 update(i<<1,l,r,co); 52 } 53 else if(l>mid) 54 { 55 update(i<<1|1,l,r,co); 56 } 57 else 58 { 59 update(i<<1,l,mid,co); 60 update(i<<1|1,mid+1,r,co); 61 } 62 } 63 64 void search1(int i) 65 { 66 if(tree[i].l==tree[i].r) 67 { 68 x[tree[i].l]=tree[i].cover; 69 return; 70 } 71 down(i); 72 search1(i<<1); 73 search1(i<<1|1); 74 } 75 76 int main() 77 { 78 while(scanf("%d%d",&n,&m)!=EOF) 79 { 80 build(1,1,n); 81 memset(x,0,sizeof(x)); 82 for(int i=1; i<=m; i++) 83 { 84 scanf("%d%d%d",&l1,&r1,&x1); 85 if(l1==x1){ 86 update(1,l1+1,r1,x1); 87 } 88 else if(r1==x1) 89 { 90 update(1,l1,r1-1,x1); 91 } 92 else 93 { 94 update(1,l1,x1-1,x1); 95 update(1,x1+1,r1,x1); 96 } 97 } 98 search1(1); 99 for(int i=1; i<=n; i++) 100 { 101 if(i==1) 102 printf("%d",x[i]); 103 else 104 printf(" %d",x[i]); 105 } 106 printf("\n"); 107 } 108 return 0; 109 }