Submission #170365

#TimeUsernameProblemLanguageResultExecution timeMemory
170365rzbtCake (CEOI14_cake)C++14
0 / 100
1573 ms44564 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define MAXN 250005
#define F first
#define S second
using namespace std;
typedef long long ll;
ll n,a;
ll niz[MAXN];

ll seg[4*MAXN];
ll lazy[4*MAXN];
set<pair<ll,ll> > svi;


void dodaj(ll l,ll d,ll p,ll x,ll k){
    if(l==d){
        seg[k]=x;
        return;
    }
    ll mid=(l+d)/2;
    if(p<=mid)return dodaj(l,mid,p,x,k+k);
    else dodaj(mid+1,d,p,x,k+k+1);
    seg[k]=max(seg[k+k],seg[k+k+1]);
}
ll dobij(ll l,ll d,ll tl,ll td,ll k){
    if(l>td || d<tl)return 0;
    if(l>=tl && d<=td)return seg[k];
    ll mid=(l+d)/2;
    return max(dobij(l,mid,tl,td,k+k),dobij(mid+1,d,tl,td,k+k+1));
}

void izgradi(ll l,ll d,ll k){
    if(l==d){
        seg[k]=niz[l];
        return;
    }
    ll mid=(l+d)/2;
    izgradi(l,mid,k+k);
    izgradi(mid+1,d,k+k+1);
    seg[k]=max(seg[k+k],seg[k+k+1]);
}

bool nadjen;

ll nadjiL(ll l,ll d,ll tl,ll td,ll k,ll x){
    //printf("   %lld %lld   %lld %lld\n",l,d,tl,td);
    if(nadjen)return -1;
    if(l>td || d<tl)return -1;
    ll mid=(l+d)/2;
    if(l>=tl && d<=td){
        if(l==d ){
            if(seg[k]>x)nadjen=true;
            return (seg[k]>x?l:-1);
        }

        if(seg[k+k+1]>x)return nadjiL(mid+1,d,tl,td,k+k+1,x);
        return nadjiL(l,mid,tl,td,k+k,x);
    }

    ll tren=nadjiL(mid+1,d,tl,td,k+k+1,x);
    if(tren!=-1)return tren;
    return nadjiL(l,mid,tl,td,k+k,x);
}

ll nadjiD(ll l,ll d,ll tl,ll td,ll k,ll x){
    //printf("   %lld %lld   %lld %lld\n",l,d,tl,td);
    if(nadjen)return -1;
    if(l>td || d<tl)return -1;
    ll mid=(l+d)/2;
    if(l>=tl && d<=td){
        if(l==d ){
            //printf("                        %lld %lld\n",seg[k],x);
            if(seg[k]>x)nadjen=true;
            return (seg[k]>x?l:-1);
        }
        //printf("                %lld %lld\n",seg[k+k],x);
        if(seg[k+k]>x)return nadjiD(l,mid,tl,td,k+k,x);
        return nadjiD(mid+1,d,tl,td,k+k+1,x);
    }

    ll tren=nadjiD(l,mid,tl,td,k+k,x);
    if(tren!=-1)return tren;
    return nadjiD(mid+1,d,tl,td,k+k+1,x);
}

int main()///PROMENI U LONG LONG
{
    scanf("%lld %lld", &n, &a);
    for(ll i=1;i<=n;i++){
        scanf("%lld",niz+i);
        niz[i]*=500005;
        svi.insert(mp(niz[i],i));
    }
    izgradi(1,n,1);
    ll qq;
    scanf("%lld", &qq);
    while(qq--){
        char qt[5];
        scanf("%s", qt);
        if(qt[0]=='E'){
            ll koji,postaje;
            scanf("%lld %lld", &koji, &postaje);
            svi.erase(mp(niz[koji],koji));
            //printf("  poz %lld brisem %lld ",koji,niz[koji]);
            auto it=svi.end();
            for(ll i=1;i<postaje;i++){
                it--;
                auto tp=*it;
                tp.F++;
                svi.erase(it);
                it=svi.insert(tp).F;
                dodaj(1,n,tp.second,tp.first,1);
                printf("%lld ",tp.S);

            }
            it--;
            niz[koji]=(it->first)+1;
            //printf(" stavljam %lld",niz[koji]);
            svi.insert(mp(niz[koji],koji));
            dodaj(1,n,koji,niz[koji],1);
            //printf("     sada %lld\n",dobij(1,n,koji,koji,1));
        }else{
            ll koji;
            scanf("%lld", &koji);
            if(koji==a){
                printf("0\n");
                continue;
            }
            if(koji<a){
                ll najv=dobij(1,n,koji,a-1,1);
                nadjen=false;
                ll tn=nadjiD(1,n,a+1,n,1,najv);
                if(tn==-1)tn=n+1;
                printf("%lld\n",tn-koji-1);
            }else{
                ll najv=dobij(1,n,a+1,koji,1);
                nadjen=false;
                ll tn=nadjiL(1,n,1,a-1,1,najv);
                if(tn==-1)tn=0;
                printf("%lld\n",koji-tn-1);
            }

        }
    }

    return 0;
}

Compilation message (stderr)

cake.cpp: In function 'int main()':
cake.cpp:91:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld %lld", &n, &a);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~
cake.cpp:93:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld",niz+i);
         ~~~~~^~~~~~~~~~~~~~
cake.cpp:99:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld", &qq);
     ~~~~~^~~~~~~~~~~~~
cake.cpp:102:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s", qt);
         ~~~~~^~~~~~~~~~
cake.cpp:105:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%lld %lld", &koji, &postaje);
             ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cake.cpp:127:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%lld", &koji);
             ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...