Pagini recente » Cod sursa (job #750871) | Cod sursa (job #1979879) | Monitorul de evaluare | Cod sursa (job #2008384) | Cod sursa (job #2556989)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n, m, baza, mod;
pair < int, int > tree[270000];
void update(int start, int stop, int c)
{
start += baza - 1;
stop +=start - 1;
mod%=100001;
for(int i = start; i <= stop; i++)
{
if(c == 1)
tree[i].x = 1;
if(c == 2)
tree[i].x = 0;
}
for(int i = baza ; i<= baza * 2 - 1; i++)
{
if(tree[i].x != tree[i-1].x)
mod++;
tree[i].y = mod;
}
int poz = baza/2;
for(int i = poz; i<=poz * 2 - 1; i++){
if(tree[i*2].x == 0){
tree[i].x=1;
tree[i].y = tree[i*2].y;
}
if(tree[i*2+ 1].x == 0){
tree[i].x=1;
tree[i].y = tree[i*2 + 1].y;
}
if(tree[i*2].x == 0 && tree[i*2 + 1].x == tree[i*2].x){
tree[i].x=2;
tree[i].y = tree[i*2].y;
}
if(tree[i*2].x == tree[i*2 + 1].x and tree[i*2].x !=0)
tree[i].x = 0;
}
for(int k = poz/2; k; k/=2)
{
for(int i = k; i<= k * 2 - 1; i++)
if(tree[i * 2].y != tree[i * 2 + 1].y){
if(tree[i * 2].x > tree[i * 2 + 1].x){
tree[i].x = tree[i*2].x;
tree[i].y = tree[i*2].y;
}else{
tree[i].x = tree[i*2 + 1].x;
tree[i].y = tree[i*2 + 1].y;
}
}else{
tree[i].x = tree[i*2].x + tree[i*2 + 1].x;
tree[i].y = tree[i*2].y;
}
}
}
int main()
{
fin>>n>>m;
baza = pow(2, (int)log2(n) + ( log2(n) > (int)log2(n) ? 1 : 0) ) + 0.5;
for(int i = baza + n; i<=baza * 2 - 1; i++)
tree[i].x = -1;
int poz = baza / 2;
for(int i = poz; i<=poz * 2 - 1; i++)
tree[i].x = (tree[i*2].x == 0 ? 1 : 0 ) + (tree[i*2 + 1].x == 0 ? 1 : 0);
for(int k = poz/2; k; k/=2)
{
for(int i=k; i<=k*2 - 1; i++)
tree[i].x = tree[i*2].x + tree[i*2 + 1].x;
}
for(int c, a, b, i = 1; i<=m; i++)
{
fin>>c;
if(c == 3)
fout<<tree[1].x<<'\n';
else
{
fin>>a>>b;
update(a, b, c);
}
}
/* for(int i = baza; i; i/=2){
for(int k = i; k <= 2*i - 1; k++)
fout<<tree[k].x<<'.'<<tree[k].y<<' ';
fout<<'\n';
}
*/
return 0;
}