Cod sursa(job #2423168)

Utilizator vladth11Vlad Haivas vladth11 Data 20 mai 2019 21:13:25
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>

using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct Node{
    int val,maxim,st,dr;
};
Node aint[1 << 17 + 1];
int maxim = 0;
void init(int nod,int st,int dr){
    aint[nod].maxim = aint[nod].st = aint[nod].dr = dr - st + 1;
    if(st == dr){
        return;
    }
    init(2 * nod,st ,(st + dr) / 2);
    init(2 * nod + 1,(st + dr) / 2 + 1,dr);
}
void update(int nod,int st,int dr,int a,int b,int val){
     int mid = st + dr;
     mid /= 2;

     if(a <= st && dr <= b){
        aint[nod].maxim = aint[nod].st = aint[nod].dr = val * (dr -st + 1);
        return;
     }
    if (aint[nod].maxim == (1 - val) * (dr - st + 1))
	{
		aint[nod * 2].maxim = aint[nod * 2].st = aint[nod * 2].dr = (1 - val) * (mid - st + 1);
		aint[nod * 2 + 1].maxim = aint[nod * 2 + 1].st = aint[nod * 2 + 1].dr = (1 - val) * (dr - mid);
	}
     if(a <= mid){
        update(nod * 2,st,mid,a,b,val);
     }
     if(b > mid){
        update(nod * 2 + 1,mid + 1,dr,a,b,val);
     }
     aint[nod].st = aint[nod * 2].st;
     aint[nod].dr = aint[nod * 2 + 1].dr;
     if(aint[nod].st == mid - st + 1)
        aint[nod].st += aint[nod * 2 + 1].st;
     if(aint[nod].dr == dr - mid){
        aint[nod].dr += aint[nod * 2].dr;
     }
     aint[nod].maxim = max(aint[nod * 2 + 1].maxim,max(aint[nod * 2].maxim,max(aint[nod].st,max(aint[nod].dr,aint[nod * 2].dr + aint[nod * 2 + 1].st))));
}

int main()
{
    int n,m;
    cin >> n >> m;
     init(1,1,n);
    while(m--){
        int cerinta;
        cin >> cerinta;
        if(cerinta == 1){
            int a,b;
            cin >> a >> b;
            update(1,1,n,a,a + b - 1,0);
        }else if(cerinta == 2){
            int a,b;
            cin >> a >> b;
            update(1,1,n,a,a + b - 1,1);
        }else{
            cout << aint[1].maxim << "\n";
        }
    }
    return 0;
}