Cod sursa(job #1960817)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 10 aprilie 2017 18:14:41
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <algorithm>
#include <cstdio>
#define N 100001
#define mid ((l+r)/2)
#define left 2*n
#define right 2*n+1
using namespace std;

struct treenode{
                int st,dr,best;
               };
treenode a[4*N],zero;
int n,x,y,op;

void update(int n,int l,int r){

    if (l==x && r==y) {
                       a[n].best=a[n].st=a[n].dr=(op-1)*(r-l+1);
                       return;
                      }

    if (a[n].best==0) a[left]=a[right]=zero;
    if (a[n].best==r-l+1) {
                          a[left].best=a[left].st=a[left].dr=mid-l+1;
                          a[right].best=a[right].st=a[right].dr=r-mid;
                          }

    if (mid<x) update(right,mid+1,r);
    else if (mid>=y) update(left,l,mid);
         else {
               int aux=x;
               x=mid+1;
               update(right,mid+1,r);
               x=aux;aux=y;y=mid;
               update(left,l,mid);
              }

    a[n].best=max(a[left].best,max(a[right].best,a[left].dr+a[right].st));

    if (a[left].best==mid-l+1) a[n].st=a[left].best+a[right].st;
    else a[n].st=a[left].st;

    if (a[right].best==r-mid) a[n].dr=a[right].best+a[left].dr;
    else a[n].dr=a[right].dr;

}

int main()
{
    int m;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    scanf("%d%d",&n,&m);
    x=1;y=n;op=2;
    update(1,1,n);

    while (m--){

        scanf("%d",&op);
        if (op==3) printf("%d\n",a[1].best);
        else {
              scanf("%d%d",&x,&y);
              y+=x-1;
              update(1,1,n);
             }
        }
    return 0;
}