#include <bits/stdc++.h>
using namespace std;
const int liscie=1048576;
int drzewo[(liscie<<1)+1][4]; // bialy:nic zolty:0 niebieski:1 zielony:2 czerwony:3
bool czerwony[(liscie<<1)+1], zolty[(liscie<<1)+1], niebieski[(liscie<<1)+1];
void przepchnij(int w, int p, int k)
{
int w1=w<<1, w2=(w<<1)+1;
czerwony[w1]|=czerwony[w];
zolty[w1]|=zolty[w];
niebieski[w1]|=niebieski[w];
czerwony[w2]|=czerwony[w];
zolty[w2]|=zolty[w];
niebieski[w2]|=niebieski[w];
if (!czerwony[w1])
{
if (zolty[w1])
{
drzewo[w1][0]=((k-p+1)>>1)-drzewo[w1][1]-drzewo[w1][2]-drzewo[w1][3];
drzewo[w1][2]+=drzewo[w1][1];
drzewo[w1][1]=0;
}
if (niebieski[w1])
{
drzewo[w1][1]=((k-p+1)>>1)-drzewo[w1][0]-drzewo[w1][2]-drzewo[w1][3];
drzewo[w1][2]+=drzewo[w1][0];
drzewo[w1][0]=0;
}
}
else
{
drzewo[w1][0]=drzewo[w1][1]=drzewo[w1][2]=0;
drzewo[w1][3]=((k-p+1)>>1);
}
if (!czerwony[w2])
{
if (zolty[w2])
{
drzewo[w2][0]=((k-p+1)>>1)-drzewo[w2][1]-drzewo[w2][2]-drzewo[w2][3];
drzewo[w2][2]+=drzewo[w2][1];
drzewo[w2][1]=0;
}
if (niebieski[w2])
{
drzewo[w2][1]=((k-p+1)>>1)-drzewo[w2][0]-drzewo[w2][2]-drzewo[w2][3];
drzewo[w2][2]+=drzewo[w2][0];
drzewo[w2][0]=0;
}
}
else
{
drzewo[w2][0]=drzewo[w2][1]=drzewo[w2][2]=0;
drzewo[w2][3]=((k-p+1)>>1);
}
return;
}
int x, y, c;
void update(int w, int p, int k)
{
// cout<<w<<" "<<p<<" "<<k<<endl;
if (czerwony[w])
return;
if (p>=x && k<=y)
{
if (c==1)
{
zolty[w]=true;
drzewo[w][0]=k-p+1-drzewo[w][1]-drzewo[w][2]-drzewo[w][3];
drzewo[w][2]+=drzewo[w][1];
drzewo[w][1]=0;
}
else if (c==2)
{
niebieski[w]=true;
drzewo[w][1]=k-p+1-drzewo[w][0]-drzewo[w][2]-drzewo[w][3];
drzewo[w][2]+=drzewo[w][0];
// if (drzewo[w][1]<0)
// cout<<"CO "<<w<<" "<<p<<" "<<k<<" "<<drzewo[w][0]<<" "<<drzewo[w][2]<<" "<<drzewo[w][3]<<endl;
drzewo[w][0]=0;
}
else
{
czerwony[w]=true;
drzewo[w][0]=drzewo[w][1]=drzewo[w][2]=0;
drzewo[w][3]=k-p+1;
}
return;
}
przepchnij(w, p, k);
int sr=p+k; sr>>=1;
if (x<=sr)
{
update(w<<1, p, sr);
}
if (y>sr)
{
update((w<<1)+1, sr+1, k);
}
drzewo[w][0]=drzewo[w<<1][0]+drzewo[(w<<1)+1][0];
drzewo[w][1]=drzewo[w<<1][1]+drzewo[(w<<1)+1][1];
drzewo[w][2]=drzewo[w<<1][2]+drzewo[(w<<1)+1][2];
drzewo[w][3]=drzewo[w<<1][3]+drzewo[(w<<1)+1][3];
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m; cin>>n>>m;
int pliscie=liscie+n;
/* for (int i=liscie; i<pliscie; i++)
drzewo[i][0]=1;
for (int i=liscie-1; i>0; i--)
drzewo[i][0]=drzewo[(i<<1)+1][0]+drzewo[i<<1][0];*/
for (int i=0; i<m; i++)
{
cin>>x>>y>>c;
update(1, 1, liscie);
// cout<<"KORZEN "<<drzewo[1][0]<<" "<<drzewo[1][1]<<" "<<drzewo[1][2]<<endl;
}
cout<<drzewo[1][2];
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 | #include <bits/stdc++.h> using namespace std; const int liscie=1048576; int drzewo[(liscie<<1)+1][4]; // bialy:nic zolty:0 niebieski:1 zielony:2 czerwony:3 bool czerwony[(liscie<<1)+1], zolty[(liscie<<1)+1], niebieski[(liscie<<1)+1]; void przepchnij(int w, int p, int k) { int w1=w<<1, w2=(w<<1)+1; czerwony[w1]|=czerwony[w]; zolty[w1]|=zolty[w]; niebieski[w1]|=niebieski[w]; czerwony[w2]|=czerwony[w]; zolty[w2]|=zolty[w]; niebieski[w2]|=niebieski[w]; if (!czerwony[w1]) { if (zolty[w1]) { drzewo[w1][0]=((k-p+1)>>1)-drzewo[w1][1]-drzewo[w1][2]-drzewo[w1][3]; drzewo[w1][2]+=drzewo[w1][1]; drzewo[w1][1]=0; } if (niebieski[w1]) { drzewo[w1][1]=((k-p+1)>>1)-drzewo[w1][0]-drzewo[w1][2]-drzewo[w1][3]; drzewo[w1][2]+=drzewo[w1][0]; drzewo[w1][0]=0; } } else { drzewo[w1][0]=drzewo[w1][1]=drzewo[w1][2]=0; drzewo[w1][3]=((k-p+1)>>1); } if (!czerwony[w2]) { if (zolty[w2]) { drzewo[w2][0]=((k-p+1)>>1)-drzewo[w2][1]-drzewo[w2][2]-drzewo[w2][3]; drzewo[w2][2]+=drzewo[w2][1]; drzewo[w2][1]=0; } if (niebieski[w2]) { drzewo[w2][1]=((k-p+1)>>1)-drzewo[w2][0]-drzewo[w2][2]-drzewo[w2][3]; drzewo[w2][2]+=drzewo[w2][0]; drzewo[w2][0]=0; } } else { drzewo[w2][0]=drzewo[w2][1]=drzewo[w2][2]=0; drzewo[w2][3]=((k-p+1)>>1); } return; } int x, y, c; void update(int w, int p, int k) { // cout<<w<<" "<<p<<" "<<k<<endl; if (czerwony[w]) return; if (p>=x && k<=y) { if (c==1) { zolty[w]=true; drzewo[w][0]=k-p+1-drzewo[w][1]-drzewo[w][2]-drzewo[w][3]; drzewo[w][2]+=drzewo[w][1]; drzewo[w][1]=0; } else if (c==2) { niebieski[w]=true; drzewo[w][1]=k-p+1-drzewo[w][0]-drzewo[w][2]-drzewo[w][3]; drzewo[w][2]+=drzewo[w][0]; // if (drzewo[w][1]<0) // cout<<"CO "<<w<<" "<<p<<" "<<k<<" "<<drzewo[w][0]<<" "<<drzewo[w][2]<<" "<<drzewo[w][3]<<endl; drzewo[w][0]=0; } else { czerwony[w]=true; drzewo[w][0]=drzewo[w][1]=drzewo[w][2]=0; drzewo[w][3]=k-p+1; } return; } przepchnij(w, p, k); int sr=p+k; sr>>=1; if (x<=sr) { update(w<<1, p, sr); } if (y>sr) { update((w<<1)+1, sr+1, k); } drzewo[w][0]=drzewo[w<<1][0]+drzewo[(w<<1)+1][0]; drzewo[w][1]=drzewo[w<<1][1]+drzewo[(w<<1)+1][1]; drzewo[w][2]=drzewo[w<<1][2]+drzewo[(w<<1)+1][2]; drzewo[w][3]=drzewo[w<<1][3]+drzewo[(w<<1)+1][3]; return; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin>>n>>m; int pliscie=liscie+n; /* for (int i=liscie; i<pliscie; i++) drzewo[i][0]=1; for (int i=liscie-1; i>0; i--) drzewo[i][0]=drzewo[(i<<1)+1][0]+drzewo[i<<1][0];*/ for (int i=0; i<m; i++) { cin>>x>>y>>c; update(1, 1, liscie); // cout<<"KORZEN "<<drzewo[1][0]<<" "<<drzewo[1][1]<<" "<<drzewo[1][2]<<endl; } cout<<drzewo[1][2]; return 0; } |
English