Submission #553389

# Submission time Handle Problem Language Result Execution time Memory
553389 2022-04-25T17:04:27 Z Amylopectin Monkey and Apple-trees (IZhO12_apple) C++14
0 / 100
0 ms 340 KB
#include <iostream>
#include <stdio.h>
using namespace std;
const long long mxn = 2e6 + 10;
long long ro,pa[mxn] = {},lrp[mxn] = {},lch[mxn] = {},rch[mxn] = {},
lbo[mxn] = {},rbo[mxn] = {},nlbo[mxn] = {},nrbo[mxn] = {},rip[mxn] = {},memcou = 0,ru = 1,
ans[mxn] = {};
long long fimi(long long l,long long r)
{
    if(l < r)
        return l;
    return r;
}
long long fima(long long l,long long r)
{
    if(l > r)
        return l;
    return r;
}
long long upd(long long fn)
{
    rip[fn] = nrbo[fn] - nlbo[fn] + 1;
    if(lch[fn] != -1)
    {
        rip[fn] += rip[lch[fn]];
        lbo[fn] = lbo[lch[fn]];
    }
    else
    {
        lbo[fn] = nlbo[fn];
    }
    if(rch[fn] != -1)
    {
        rip[fn] += rip[rch[fn]];
        rbo[fn] = rbo[rch[fn]];
    }
    else
    {
        rbo[fn] = nrbo[fn];
    }
    return 0;
}
long long utr(long long cn)
{
    while(cn != -1)
    {
        upd(cn);
        cn = pa[cn];
    }
    return 0;
}
//long long sply(long long cn)
//{
//    long long fn,tn,f;
//    if(ro == cn)
//    {
//        upd(cn);
//        return 0;
//    }
//    fn = pa[cn];
//    if(fn == ro)
//    {
//        pa[cn] = pa[fn];
//        if(fn != ro)
//        {
//            if(lrp[fn] == -1)
//            {
//                rch[pa[fn]] = cn;
//            }
//            else
//            {
//                lch[pa[fn]] = cn;
//            }
//        }
//        if(lrp[cn] == -1)
//        {
//            lrp[cn] = lrp[fn];
//            rch[fn] = lch[cn];
//            if(lch[cn] != -1)
//            {
//                pa[lch[cn]] = fn;
//                lrp[lch[cn]] = -1;
//            }
//            lch[cn] = fn;
//            pa[fn] = cn;
//            lrp[fn] = 1;
//        }
//        else
//        {
//            lrp[cn] = lrp[fn];
//            lch[fn] = rch[cn];
//            if(rch[cn] != -1)
//            {
//                pa[rch[cn]] = fn;
//                lrp[rch[cn]] = 1;
//            }
//            rch[cn] = fn;
//            pa[fn] = cn;
//            lrp[fn] = -1;
//        }
//    }
//    else
//    {
//        tn = pa[fn];
//        pa[cn] = pa[tn];
//        if(tn != ro)
//        {
//            if(lrp[tn] == -1)
//            {
//                rch[pa[tn]] = cn;
//            }
//            else
//            {
//                lch[pa[tn]] = cn;
//            }
//        }
//        if(lrp[cn] == -1)
//        {
//            if(lrp[fn] == -1)
//            {
//                lrp[cn] = lrp[tn];
//                rch[tn] = lch[fn];
//                if(lch[fn] != -1)
//                {
//                    pa[lch[fn]] = tn;
//                    lrp[lch[fn]] = -1;
//                }
//                rch[fn] = lch[cn];
//                if(lch[cn] != -1)
//                {
//                    pa[lch[cn]] = fn;
//                    lrp[lch[cn]] = -1;
//                }
//                lch[fn] = tn;
//                pa[tn] = fn;
//                lrp[tn] = 1;
//                lch[cn] = fn;
//                pa[fn] = cn;
//                lrp[fn] = 1;
//            }
//            else
//            {
//                lrp[cn] = lrp[tn];
//                rch[fn] = lch[cn];
//                if(lch[cn] != -1)
//                {
//                    pa[lch[cn]] = fn;
//                    lrp[lch[cn]] = -1;
//                }
//                lch[tn] = rch[cn];
//                if(rch[cn] != -1)
//                {
//                    pa[rch[cn]] = tn;
//                    lrp[rch[cn]] = 1;
//                }
//                lch[cn] = fn;
//                pa[fn] = cn;
//                lrp[fn] = 1;
//                rch[cn] = tn;
//                pa[tn] = cn;
//                lrp[tn] = -1;
//            }
//        }
//        else
//        {
//            if(lrp[fn] == -1)
//            {
//                lrp[cn] = lrp[tn];
//                rch[tn] = lch[cn];
//                if(lch[cn] != -1)
//                {
//                    pa[lch[cn]] = tn;
//                    lrp[lch[cn]] = -1;
//                }
//                lch[fn] = rch[cn];
//                if(rch[cn] != -1)
//                {
//                    pa[rch[cn]] = fn;
//                    lrp[rch[cn]] = 1;
//                }
//                lch[cn] = tn;
//                pa[tn] = cn;
//                lrp[tn] = 1;
//                rch[cn] = fn;
//                pa[fn] = cn;
//                lrp[fn] = -1;
//            }
//            else
//            {
//                lrp[cn] = lrp[tn];
//                lch[tn] = rch[fn];
//                if(rch[fn] != -1)
//                {
//                    pa[rch[fn]] = tn;
//                    lrp[rch[fn]] = 1;
//                }
//                lch[fn] = rch[cn];
//                if(rch[cn] != -1)
//                {
//                    pa[rch[cn]] = fn;
//                    lrp[rch[cn]] = 1;
//                }
//                rch[fn] = tn;
//                pa[tn] = fn;
//                lrp[tn] = -1;
//                rch[cn] = fn;
//                pa[fn] = cn;
//                lrp[fn] = -1;
//            }
//        }
//        upd(tn);
//    }
//    upd(fn);
//    upd(cn);
//    if(fn != ro && tn != ro)
//    {
//        sply(cn);
//    }
//    ro = cn;
//    return 0;
//}
long long del(long long cn)
{
    if(lch[cn] == -1)
    {
        if(rch[cn] == -1)
        {
            if(pa[cn] != -1)
            {
                if(lrp[cn] == -1)
                {
                    rch[pa[cn]] = -1;
                }
                else
                {
                    lch[pa[cn]] = -1;
                }
            }
//            if(pa[cn] != -1)
//                sply(pa[cn]);
            utr(pa[cn]);
            return pa[cn];
        }
        else
        {
            if(pa[cn] != -1)
            {
                if(lrp[cn] == -1)
                {
                    rch[pa[cn]] = rch[cn];
                }
                else
                {
                    lch[pa[cn]] = rch[cn];
                }
            }
            else
            {
                ro = rch[cn];
            }
            lrp[rch[cn]] = lrp[cn];
            pa[rch[cn]] = pa[cn];
//            sply(rch[cn]);
            utr(rch[cn]);
            return rch[cn];
        }
    }
    else
    {
        if(rch[cn] == -1)
        {
            if(pa[cn] != -1)
            {
                if(lrp[cn] == -1)
                {
                    rch[pa[cn]] = lch[cn];
                }
                else
                {
                    lch[pa[cn]] = lch[cn];
                }
            }
            else
            {
                ro = lch[cn];
            }
            lrp[lch[cn]] = lrp[cn];
            pa[lch[cn]] = pa[cn];
//            sply(lch[cn]);
            utr(lch[cn]);
            return lch[cn];
        }
        else
        {
            long long fn = lch[cn],tn;
            while(rch[fn] != -1)
            {
                fn = rch[fn];
            }
            tn = pa[fn];
            if(tn == cn)
            {
//                if(lch[fn] != -1)
//                {
                    lch[cn] = lch[fn];
//                }
            }
            else
            {
                rch[tn] = lch[fn];
                if(lch[fn] != -1)
                {
                    lrp[lch[fn]] = -1;
                }
            }
            if(lch[fn] != -1)
                pa[lch[fn]] = tn;
//            del(fn);
            pa[fn] = pa[cn];
            lrp[fn] = lrp[cn];
//            if(lch[cn] != fn)
//            {
                lch[fn] = lch[cn];
//            }
//            else
//            {
//                lch[fn] = -1;
//            }
            rch[fn] = rch[cn];
            if(lch[cn] != -1)
            {
                pa[lch[cn]] = fn;
            }
            if(rch[cn] != -1)
            {
                pa[rch[cn]] = fn;
            }
            if(pa[cn] != -1)
            {
                if(lrp[cn] == -1)
                {
                    rch[pa[cn]] = fn;
                }
                else
                {
                    lch[pa[cn]] = fn;
                }
            }
            if(cn == ro)
            {
                ro = fn;
            }
//            if(tn != cn)
//                sply(tn);
//            sply(fn);
            if(tn != cn)
                utr(tn);
            utr(fn);
            return fn;
        }
    }
    while(1)
        printf("efef");
    return -1;
}
long long ripe(long long cn,long long tl,long long tr)
{
    long long fn;
    if(nlbo[cn] > tr)
    {
        if(lch[cn] != -1)
        {
            ripe(lch[cn],tl,tr);
        }
        else
        {
            lch[cn] = ru;
            lch[ru] = -1;
            rch[ru] = -1;
            pa[ru] = cn;
            lrp[ru] = 1;
            nlbo[ru] = tl;
            nrbo[ru] = tr;
            lbo[ru] = tl;
            rbo[ru] = tr;
            rip[ru] = tr-tl+1;
            lbo[cn] = tl;
            rip[cn] += rip[ru];
            ru ++;
//            sply(ru-1);
            utr(ru-1);
        }
    }
    else if(nrbo[cn] < tl)
    {
        if(rch[cn] != -1)
        {
            ripe(rch[cn],tl,tr);
        }
        else
        {
            rch[cn] = ru;
            lch[ru] = -1;
            rch[ru] = -1;
            pa[ru] = cn;
            lrp[ru] = -1;
            nlbo[ru] = tl;
            nrbo[ru] = tr;
            lbo[ru] = tl;
            rbo[ru] = tr;
            rip[ru] = tr-tl+1;
            rbo[cn] = tr;
            rip[cn] += rip[ru];
            ru ++;
//            sply(ru-1);
            utr(ru-1);
        }
    }
    else
    {
        tl = fimi(tl,nlbo[cn]);
        tr = fima(tr,nrbo[cn]);
        fn = del(cn);
        if(fn == -1)
        {
            ro = ru;
            lch[ru] = -1;
            rch[ru] = -1;
            pa[ru] = -1;
            lrp[ru] = 0;
            nlbo[ru] = tl;
            nrbo[ru] = tr;
            lbo[ru] = tl;
            rbo[ru] = tr;
            rip[ru] = tr-tl+1;
            ru ++;
//            sply(ru-1);
            utr(ru-1);
        }
        else
        {
            ripe(fn,tl,tr);
        }
    }
    return 0;
}
long long getva(long long cn,long long tl,long long tr)
{
    if(lbo[cn] > tr || rbo[cn] < tl)
    {
        return 0;
    }
    if(lbo[cn] >= tl && rbo[cn] <= tr)
    {
        return rip[cn];
    }
    long long cva = 0;
    if(nlbo[cn] <= tl && nrbo[cn] >= tr)
    {
        cva += tr - tl + 1;
    }
    else if(nlbo[cn] >= tl && nrbo[cn] <= tr)
    {
        cva += nrbo[cn] - nlbo[cn] + 1;
    }
    else if(nrbo[cn] >= tl && nlbo[cn] < tl)
    {
        cva += nrbo[cn] - tl + 1;
    }
    else if(nlbo[cn] <= tr && nrbo[cn] > tr)
    {
        cva += tr - nlbo[cn] + 1;
    }
    if(lch[cn] != -1)
    {
        cva += getva(lch[cn],tl,tr);
    }
    if(rch[cn] != -1)
    {
        cva += getva(rch[cn],tl,tr);
    }
    return cva;
}
int main()
{
    long long i,j,n,m,cl,cr,sta,cva,c = 0,cou = 0;
    scanf("%lld",&n);
    ro = -1;
    for(i=0; i<n; i++)
    {
        scanf("%lld %lld %lld",&sta,&cl,&cr);
        cl += c;
        cr += c;
        if(sta == -1)
        {
            break;
        }
        else if(sta == 1)
        {
            if(ro == -1)
            {
                cva = 0;
            }
            else
            {
                cva = getva(ro,cl,cr);
            }
            ans[cou] = cva;
            cou ++;
//            printf("%lld\n",cva);
            c += cva;
        }
        else
        {
            if(ro == -1)
            {
                ro = ru;
                lch[ru] = -1;
                rch[ru] = -1;
                pa[ru] = -1;
                lrp[ru] = 0;
                nlbo[ru] = cl;
                nrbo[ru] = cr;
                lbo[ru] = cl;
                rbo[ru] = cr;
                rip[ru] = cr-cl+1;
                ru ++;
            }
            else
            {
                ripe(ro,cl,cr);
            }
        }
    }
    for(i=0; i<cou; i++)
    {
        printf("%lld\n",ans[i]);
    }
    return 0;
}

Compilation message

apple.cpp: In function 'int main()':
apple.cpp:486:17: warning: unused variable 'j' [-Wunused-variable]
  486 |     long long i,j,n,m,cl,cr,sta,cva,c = 0,cou = 0;
      |                 ^
apple.cpp:486:21: warning: unused variable 'm' [-Wunused-variable]
  486 |     long long i,j,n,m,cl,cr,sta,cva,c = 0,cou = 0;
      |                     ^
apple.cpp:487:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  487 |     scanf("%lld",&n);
      |     ~~~~~^~~~~~~~~~~
apple.cpp:491:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  491 |         scanf("%lld %lld %lld",&sta,&cl,&cr);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Incorrect 0 ms 324 KB Output isn't correct
3 Halted 0 ms 0 KB -