Advertisement
Hezov

Hotel - Lot 2002 infoarena

Mar 24th, 2025
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. ifstream cin("hotel.in");
  4. ofstream cout("hotel.out");
  5. const int mxN = 1e5;
  6. struct node{int sum=0, pref, suf, flag;}A[4*mxN+1];
  7. void printInfo(int node, int st, int dr)
  8. {
  9.      cout << "st = " << st << " dr = " << dr << '\n';
  10.      cout << "sum = " << A[node].sum << '\n';
  11.      cout << "pref = " << A[node].pref << ' ' << " suf = " << A[node].suf << '\n';
  12.      cout << "flag = " << A[node].flag << '\n';
  13. }
  14. void build(int node, int st ,int dr)
  15. {
  16.     if(st == dr)
  17.     {
  18.         A[node] = {1,1,1,0};
  19.         return;
  20.     }
  21.     int mid = (st + dr) / 2;
  22.     build(2*node,st,mid);
  23.     build(2*node+1,mid+1,dr);
  24.     int val = A[2*node].sum + A[2*node+1].sum;
  25.     A[node] = {val,val,val,0};
  26. }
  27. void update(int node , int st, int dr, int a , int b, int val)
  28. {
  29.     if(a<=st && dr <= b)
  30.     {
  31.         if(val == 1) // se ocupa intervalul.
  32.             A[node] = {0,0,0,1};
  33.         if(val == 0) // se elibera intervalul
  34.         {
  35.             int len = dr - st + 1;
  36.             A[node] = {len,len,len,2};
  37.         }
  38.         //printInfo(node,st,dr);
  39.         return;
  40.     }
  41.     int mid = (st + dr) / 2;
  42.     int lenSt = mid - st + 1, lenDr = dr - mid;
  43.     if(A[node].flag == 1)
  44.         A[2*node] = A[2*node+1] = {0,0,0,1}, A[node].flag = 0;
  45.     if(A[node].flag == 2)
  46.     {
  47.         A[node].flag = 0;
  48.         A[2*node] = {lenSt,lenSt,lenSt, 2};
  49.         A[2*node+1] = {lenDr,lenDr,lenDr,2};
  50.     }
  51.     if(a<=mid)
  52.         update(2*node,st,mid,a,b,val);
  53.     if(b>mid)
  54.         update(2*node+1,mid+1,dr,a,b,val);
  55.     // dam update la intervalul combinat
  56.     A[node].pref = A[2*node].pref;
  57.     if(A[node].pref == lenSt)
  58.         A[node].pref += A[2*node+1].pref;
  59.     A[node].suf = A[2*node+1].suf;
  60.     if(A[node].suf == lenDr)
  61.         A[node].suf += A[2*node].suf;
  62.     A[node].sum = max(A[2*node].sum, A[2*node+1].sum);
  63.     A[node].sum = max(A[node].sum, A[2*node].suf + A[2*node+1].pref);
  64.     //printInfo(node,st,dr);
  65. }
  66. int main()
  67. {
  68.     int n , m;
  69.     cin >> n >> m;
  70.     build(1,1,n);
  71.     for(int i = 1;i<=m;i++)
  72.     {
  73.         //cout << "QUERY :";
  74.         int op; cin >> op;
  75.         if(op == 1)
  76.         {
  77.             int a , b;
  78.             cin >> a >> b;
  79.             update(1,1,n,a,a + b - 1,1);
  80.         }
  81.         if(op == 2)
  82.         {
  83.             int a, b;
  84.             cin >> a >> b;
  85.             update(1,1,n,a,a + b - 1,0);
  86.         }
  87.         if(op == 3)
  88.         {
  89.            cout << A[1].sum << '\n';
  90.         }
  91.     }
  92.     return 0;
  93. }
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement