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 }
View Code

 

你可能感兴趣的:(name)