Cod sursa(job #3160317)

Utilizator danyyyDaniel danyyy Data 23 octombrie 2023 18:09:15
Problema Hotel Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int N=1<<15;
int aint[N],sum=0,smax;
void cerinta1(int p,int st,int dr,int a,int b)
{
    if(st==dr)
    {
        aint[p]=1;
    }
    else
    {
        int mij=(st+dr)/2,fs=p*2,fd=p*2+1;
        if(a<=mij)cerinta1(fs,st,mij,a,b);
        if(b>mij)cerinta1(fd,mij+1,dr,a,b);
        aint[p]=aint[fd]+aint[fs];
    }
}
void cerinta2(int p,int st,int dr,int a,int b)
{
    if(st==dr)
    {
        aint[p]=0;
    }
    else
    {
        int mij=(st+dr)/2,fs=p*2,fd=p*2+1;
        if(a<=mij)cerinta2(fs,st,mij,a,b);
        if(b>mij)cerinta2(fd,mij+1,dr,a,b);
        aint[p]=aint[fd]+aint[fs];
    }
}
void cerinta3(int p,int st,int dr)
{
  if(aint[p]==0)
  {
      sum=sum+dr-st+1;
  }
  else if(aint[p]==dr-st+1)
  {
      if(smax<sum)smax=sum;
      sum=0;
  }
  else
  {
      int mij=(st+dr)/2,fs=2*p,fd=2*p+1;
      cerinta3(fs,st,mij);
      cerinta3(fd,mij+1,dr);
  }
}
int main()
{
    int n,q;
    fin>>n;
    fin>>q;
    for(int i=1; i<=q; i++)
    {
        int tip,a,x,b;
        fin>>tip;
        if(tip==1)
        {
            fin>>a>>x;
            b=a+x-1;
            cerinta1(1,1,n,a,b);
        }
        else if(tip==2)
        {
            fin>>a>>x;
            b=a+x-1;
            cerinta2(1,1,n,a,b);
        }
        else
        {
            sum=0,smax=-1;
            cerinta3(1,1,n);
            if(smax<sum)smax=sum;
            fout<<smax<<'\n';
        }
    }
}