제출 #523649

#제출 시각아이디문제언어결과실행 시간메모리
523649Deepesson푸드 코트 (JOI21_foodcourt)C++17
68 / 100
241 ms89164 KiB
#include <bits/stdc++.h>
#define MAX 305000
using ll = long long;
typedef std::array<std::array<ll,2>,2> matriz;
matriz mul(matriz a,matriz b){
    matriz c = {};
    for(auto&x:c)for(auto&y:x)y=(-1LL<<60LL);
    for(int i=0;i!=2;++i){
        for(int j=0;j!=2;++j){
            for(int k=0;k!=2;++k){
                c[i][j]=std::max(c[i][j],a[i][k]+b[k][j]);
            }
        }
    }
    return c;
}
matriz montar(long long X){
    matriz u = {};
    for(auto&x:u)for(auto&y:x)y=(-(1LL<<60LL));
    u[0][0]=X;
    u[1][1]=0;
    u[1][0]=0;
    return u;
}
matriz neutro,base;
matriz tab[MAX*4];
void update(int t,matriz g,int la=0,int ra=MAX-1,int pos=1){
    if(t>ra||la>t)return;
    if(la==ra){
        tab[pos]=g;
        return;
    }
    int m = (la+ra)/2;
    update(t,g,la,m,pos*2);
    update(t,g,m+1,ra,(pos*2)+1);
 /*   std::cout<<"Tem "<<tab[pos*2][0][0]<<" "<<tab[(pos*2)+1][0][0]<<"\n";
    for(int i=0;i!=2;++i){
        for(int j=0;j!=2;++j){
            std::cout<<tab[pos*2][i][j]<<" ";
        }
        std::cout<<"\n";
    }
    std::cout<<"Direita:\n";
    for(int i=0;i!=2;++i){
        for(int j=0;j!=2;++j){
            std::cout<<tab[(pos*2)+1][i][j]<<" ";
        }
        std::cout<<"\n";
    }
    std::cout<<"\n";*/
    tab[pos]=mul(tab[pos*2],tab[(pos*2)+1]);
   /// std::cout<<"Atualiza "<<tab[pos][0][0]<<"\n";
}
matriz query(int l,int r,int la=0,int ra=MAX-1,int pos=1){
    if(l>ra||la>r)return neutro;
    if(la>=l&&ra<=r){
        return tab[pos];
    }
    int m=(la+ra)/2;
    return mul(query(l,r,la,m,pos*2),query(l,r,m+1,ra,(pos*2)+1));
}
long long ft[MAX];
#define LSB(A) (A&(-A))
void add(long long x,long long y){
    x+=6;
    while(x<MAX){
        ft[x]+=y;
        x+=LSB(x);
    }
}
ll query(long long x){
    x+=6;
    ll ans=0;
    while(x>0){
        ans+=ft[x];
        x-=LSB(x);
    }
    return ans;
}
typedef std::pair<long long,matriz> pim;
typedef std::pair<long long,long long> pii;
typedef std::pair<pii,long long> ppi;
std::vector<pim> matupdate[MAX];
std::vector<pii> ftupdate[MAX];
std::vector<ppi> queries[MAX];
long long grupo[MAX];
long long respostas[MAX];
int main()
{
    neutro[0][1]=neutro[1][0]=(-(1LL<<60LL));
    for(auto&x:tab)x=neutro;
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    long long N,M,Q;
    std::cin>>N>>M>>Q;
    long long cur=0;
    for(int i=0;i!=Q;++i){
        long long t;
        std::cin>>t;
        if(t==1){
            long long L,R,C,K;
            std::cin>>L>>R>>C>>K;
            --L;
            grupo[i]=C;
            ftupdate[L].push_back({i,K});
            ftupdate[R].push_back({i,-K});
            matupdate[L].push_back({i,montar(K)});
            matupdate[R].push_back({i,neutro});
        }else if(t==2){
            long long L,R,K;
            std::cin>>L>>R>>K;
            --L;
            matupdate[L].push_back({i,montar(-K)});
            matupdate[R].push_back({i,neutro});
        }else {
            long long A,B;
            std::cin>>A>>B;--A;
            queries[A].push_back({{B,i},cur});
            ++cur;
        }
    }
    for(int i=0;i!=M+5;++i){
        for(auto&x:ftupdate[i]){
            add(x.first,x.second);
        }
        for(auto&x:matupdate[i]){
        ///    std::cout<<"Add "<<x.first<<" "<<x.second[0][0]<<"\n";
            update(x.first,x.second);
         ///   std::cout<<"Novo "<<tab[1][0][0]<<"\n";
        }
        for(auto&x:queries[i]){
            long long escolhido = x.first.first;
            long long tempo = x.first.second;
            long long indice = x.second;
            matriz q = mul(base,query(0,tempo));
            long long nafila = q[0][0];
         ///   std::cout<<"Na fila: "<<nafila<<" "<<tempo<<"\n";
            if(nafila<escolhido){
                respostas[indice]=0;
                continue;
            }
            long long soma = query(tempo);
            long long retirar = nafila-escolhido;
            long long pegar = soma - retirar;
          ///  std::cout<<soma<<" "<<nafila<<"\n";
            long long l=0,r=tempo;
            while(l<r){
                long long m = (l+r)/2;
                long long g = query(m);
                if(g>=pegar){
                    r=m;
                }else l=m+1;
            }
          ///  std::cout<<"Achou "<<l<<"\n";
            respostas[indice]=grupo[l];
        }
    }

    for(int i=0;i!=cur;++i){
        std::cout<<respostas[i]<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...