Cod sursa(job #2500956)

Utilizator Hey_HeyIacovlev Denis Hey_Hey Data 28 noiembrie 2019 21:30:18
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
#define N 100005
 
using namespace std;
 
ifstream fi ("hotel.in");
ofstream fo ("hotel.out");
 
int n, m, op,  x, y, q;
bool a,b,c;
struct 
nume
{
	int x,y,s;
} A[3 * N], ans;
 
void Build(int pos, int st, int dr)
{
    int mij = (st + dr) / 2;
    if (st == dr)
    {
        A[pos].s=1, A[pos].x=1, A[pos].y=1;
        return;
    }
    
    Build(2 * pos, st, mij);
    Build(2 * pos + 1, mij + 1, dr);
    
    A[pos].s=A[pos].x=A[pos].y=A[pos*2].s+A[pos*2+1].s;
}
 
void Update(int pos, int st, int dr)
{
    int mij = (st + dr) / 2;
    if (st == dr) 
    {
    	if (st>=x && dr<=y) A[pos].s=q, A[pos].x=q, A[pos].y=q;
	    return;
	}
	
    

	Update(2 * pos, st, mij);
    Update(2 * pos + 1, mij + 1, dr);
    
    a=(A[pos*2].x==A[pos*2].y && A[pos*2].x==A[pos*2].s && A[pos*2].s==((dr+st)/2-st+1));
    b=(A[pos*2+1].x==A[pos*2+1].y && A[pos*2+1].x==A[pos*2+1].s && A[pos*2+1].s==(dr-(dr+st)/2));
    if(a && b) A[pos].s=A[pos*2].s+A[pos*2+1].s, A[pos].x=A[pos].s, A[pos].y=A[pos].s;
    else
    if(a & !b) A[pos].x=A[pos*2].s+A[pos*2+1].x, A[pos].s=max(A[pos*2].s,A[pos*2].y+A[pos*2+1].x), A[pos].y=A[pos*2+1].y;
    else
    if(!a & b) A[pos].y=A[pos*2].y+A[pos*2+1].s, A[pos].s=max(A[pos*2].y+A[pos*2+1].x,A[pos*2+1].s), A[pos].x=A[pos*2].x;
    else
    A[pos].s=max(max(A[pos*2].s,A[pos*2+1].s),A[pos*2].y+A[pos*2+1].x),A[pos].x=A[pos*2].x,A[pos].y=A[pos*2+1].y;
}
 
int main()
{
    fi >> n >> m;
    
    Build(1,1,n);
    
    for (int i = 1; i <= m; i++)
    {
        fi >> op;
        if(op == 1)
        {
        	fi >> x >> y;
        	y+=x-1, q=0;
        	
        	Update(1,1,n);
		}
		else
		if(op == 2)
        {
        	fi >> x >> y;
        	y+=x-1, q=1;
        	
        	Update(1,1,n);
		}
		else
        if (op == 3) fo << A[1].s << '\n';
            /*ans.s=0;ans.x=0;ans.y=0;
            Query(1, 1, n);
            fo << ans.s<< "\n";*/
        
        
        //for(int i=1; i<=n*3; i++) fo << "\n A[" << i << "]" <<  " s=" << A[i].s << " x=" << A[i].x << " y=" << A[i].y; fo << '\n'; 
    }
    
    return 0;
}