#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; } |
English