Cod sursa(job #2331322)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 29 ianuarie 2019 14:42:51
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,m,p,lf,rg,val;
struct name{
  int gol,l,r,occ;
}v[400002];

void read(){
  fscanf(in,"%d %d",&n,&p);
}

void update(int node, int left,int right){
  if(left==right && left>=lf && right<=rg){
    v[node].occ=val;
    if(val)
      v[node].l=v[node].r=v[node].gol=0;
    else
      v[node].l=v[node].r=v[node].gol=right-left+1;
    return;
  }
  int mijint=(left+right)/2;
  if(rg<=mijint)
    update(node*2,left,mijint);
  else if(lf>mijint)
    update(node*2+1,mijint+1,right);
  else if(lf<=mijint && rg>mijint){
    update(node*2,left,mijint);
    update(node*2+1,mijint+1,right);
  }
  v[node].gol=max(max(v[node*2].gol,v[node*2+1].gol),v[node*2].r+v[node*2+1].l);
  v[node].l=v[node*2].l;
  if(v[node*2].l==mijint-left+1)
    v[node].l+=v[node*2+1].l;
  v[node].r=v[node*2+1].r;
  if(v[node*2+1].r==right-mijint)
    v[node].r+=v[node*2].r;

}

void actual(int node,int left,int right){
  if(node>3*n)
    return;
  v[node].gol=v[node].l=v[node].r=right-left+1;
  int mij=(left+right)/2;
  actual(node*2,left,mij);
  actual(node*2+1,mij+1,right);
}

void solve(){
  int c;
  v[1].gol=n;
  actual(1,1,n);
  for(int i=1;i<=p;i++){
    fscanf(in,"%d",&c);
    if(c==1){
      fscanf(in,"%d %d",&lf,&rg);
      rg=lf+rg-1;
      val=1;
      update(1,1,n);
    }
    else if(c==2){
      fscanf(in,"%d %d",&lf,&rg);
      rg=lf+rg-1;
      val=0;
      update(1,1,n);
    }
    else{
      fprintf(out,"%d\n",v[1].gol);
    }
  }
}

int main(){
    in=fopen("hotel.in","r");
    out=fopen("hotel.out","w");
    read();
    solve();
    return 0;
}