#include<stdio.h> #include<set> int n,m,k,x,r,c,z,i,l,koordynat_x,koordynat_y,granica_y,granica_x,teraz_x,teraz_y; int min_wys_y,max_wys_y; bool zniszczyc,zamiana,zmiana_drogi; int w_dol[101010]; int tymczas_w_dol[101010]; int main () { std::set<int> Warownie[100001];///[koordynat_y] std::set<int> ::iterator itup; scanf("%i %i %i",&n,&m,&k); if (n>m) { std::swap(n,m); zamiana=true; } else { zamiana=false; } for (i=0;i<=n;i++) { Warownie[i].insert(m); } for (i=0;i<=n;i++) { Warownie[n].insert(i); } x=0; granica_y=0; granica_x=0; for (i=1;i<=n;i++) { w_dol[i]=m-1; } for (l=1;l<=k;l++) { zniszczyc=false; zmiana_drogi=false; scanf("%i %i %i",&r,&c,&z); if (zamiana==true) { std::swap(r,c); } koordynat_y=(r^x); koordynat_y=koordynat_y % n; koordynat_x=(c^x); koordynat_x=koordynat_x % m; Warownie[koordynat_y].insert(koordynat_x); if (koordynat_y>=granica_y && koordynat_x>=granica_x && koordynat_x<=w_dol[koordynat_y+1] && koordynat_x>=w_dol[koordynat_y]) { teraz_x=koordynat_x; teraz_y=koordynat_y; min_wys_y=koordynat_y; max_wys_y=koordynat_y; zmiana_drogi=true; ///zmiana drogi; //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); if(koordynat_x==w_dol[koordynat_y]) { teraz_y--; while(Warownie[teraz_y].count(teraz_x-1)) { teraz_y--; } } teraz_x--; //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; } while(w_dol[max_wys_y+1]>teraz_x) { //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); while(Warownie[teraz_y+1].count(teraz_x) && (teraz_x==0 || !(Warownie[teraz_y].count(teraz_x-1))) && teraz_x>=granica_x) { teraz_x--; } if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; break; } i=teraz_y; bool do_gory=false; while (w_dol[i]>teraz_x && i>=granica_y) { /*if(tymczas_w_dol[i]==0) { tymczas_w_dol[i] }*/ if (Warownie[i].count(teraz_x)) { teraz_y=i-1; do_gory=true; } i--; } if(do_gory) { continue; } if(Warownie[teraz_y].count(teraz_x-1)) { while(Warownie[teraz_y].count(teraz_x-1)) { teraz_y--; if (min_wys_y>teraz_y) { min_wys_y=teraz_y; } } continue; } while(w_dol[max_wys_y+1]>teraz_x && !(Warownie[teraz_y+1].count(teraz_x))) { teraz_y++; if (teraz_y>max_wys_y) { max_wys_y=teraz_y; } tymczas_w_dol[teraz_y]=teraz_x; itup=Warownie[teraz_y].upper_bound(teraz_x); teraz_x=*itup; teraz_x--; } //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); } if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; } } /*if(l%2==0) { zniszczyc=true; } */ //printf("r=%i c=%i x=%i\n",r^x,c^x,x); //printf("(x,y)=(%i,%i)\n",koordynat_x,koordynat_y); //printf("granica_x=%i granica_y=%i",granica_x,granica_y); //printf("droga\n"); for (i=0;i<=n;i++) { //printf("%i ",w_dol[i]); } //printf("\n"); if(zniszczyc==true) { printf("TAK\n"); Warownie[koordynat_y].erase(koordynat_x); if (koordynat_y>granica_y) { granica_y=koordynat_y; } if(koordynat_x>granica_x) { granica_x=koordynat_x; } x=x^z; } else { printf("NIE\n"); if (zmiana_drogi) { for (i=max_wys_y;i>=min_wys_y;i--) { w_dol[i]=tymczas_w_dol[i]; } } } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | #include<stdio.h> #include<set> int n,m,k,x,r,c,z,i,l,koordynat_x,koordynat_y,granica_y,granica_x,teraz_x,teraz_y; int min_wys_y,max_wys_y; bool zniszczyc,zamiana,zmiana_drogi; int w_dol[101010]; int tymczas_w_dol[101010]; int main () { std::set<int> Warownie[100001];///[koordynat_y] std::set<int> ::iterator itup; scanf("%i %i %i",&n,&m,&k); if (n>m) { std::swap(n,m); zamiana=true; } else { zamiana=false; } for (i=0;i<=n;i++) { Warownie[i].insert(m); } for (i=0;i<=n;i++) { Warownie[n].insert(i); } x=0; granica_y=0; granica_x=0; for (i=1;i<=n;i++) { w_dol[i]=m-1; } for (l=1;l<=k;l++) { zniszczyc=false; zmiana_drogi=false; scanf("%i %i %i",&r,&c,&z); if (zamiana==true) { std::swap(r,c); } koordynat_y=(r^x); koordynat_y=koordynat_y % n; koordynat_x=(c^x); koordynat_x=koordynat_x % m; Warownie[koordynat_y].insert(koordynat_x); if (koordynat_y>=granica_y && koordynat_x>=granica_x && koordynat_x<=w_dol[koordynat_y+1] && koordynat_x>=w_dol[koordynat_y]) { teraz_x=koordynat_x; teraz_y=koordynat_y; min_wys_y=koordynat_y; max_wys_y=koordynat_y; zmiana_drogi=true; ///zmiana drogi; //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); if(koordynat_x==w_dol[koordynat_y]) { teraz_y--; while(Warownie[teraz_y].count(teraz_x-1)) { teraz_y--; } } teraz_x--; //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; } while(w_dol[max_wys_y+1]>teraz_x) { //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); while(Warownie[teraz_y+1].count(teraz_x) && (teraz_x==0 || !(Warownie[teraz_y].count(teraz_x-1))) && teraz_x>=granica_x) { teraz_x--; } if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; break; } i=teraz_y; bool do_gory=false; while (w_dol[i]>teraz_x && i>=granica_y) { /*if(tymczas_w_dol[i]==0) { tymczas_w_dol[i] }*/ if (Warownie[i].count(teraz_x)) { teraz_y=i-1; do_gory=true; } i--; } if(do_gory) { continue; } if(Warownie[teraz_y].count(teraz_x-1)) { while(Warownie[teraz_y].count(teraz_x-1)) { teraz_y--; if (min_wys_y>teraz_y) { min_wys_y=teraz_y; } } continue; } while(w_dol[max_wys_y+1]>teraz_x && !(Warownie[teraz_y+1].count(teraz_x))) { teraz_y++; if (teraz_y>max_wys_y) { max_wys_y=teraz_y; } tymczas_w_dol[teraz_y]=teraz_x; itup=Warownie[teraz_y].upper_bound(teraz_x); teraz_x=*itup; teraz_x--; } //printf("teraz_x=%i teraz_y=%i\n",teraz_x,teraz_y); } if (teraz_x<granica_x || teraz_y<granica_y) { zniszczyc=true; } } /*if(l%2==0) { zniszczyc=true; } */ //printf("r=%i c=%i x=%i\n",r^x,c^x,x); //printf("(x,y)=(%i,%i)\n",koordynat_x,koordynat_y); //printf("granica_x=%i granica_y=%i",granica_x,granica_y); //printf("droga\n"); for (i=0;i<=n;i++) { //printf("%i ",w_dol[i]); } //printf("\n"); if(zniszczyc==true) { printf("TAK\n"); Warownie[koordynat_y].erase(koordynat_x); if (koordynat_y>granica_y) { granica_y=koordynat_y; } if(koordynat_x>granica_x) { granica_x=koordynat_x; } x=x^z; } else { printf("NIE\n"); if (zmiana_drogi) { for (i=max_wys_y;i>=min_wys_y;i--) { w_dol[i]=tymczas_w_dol[i]; } } } } return 0; } |