Submission #1332822

#TimeUsernameProblemLanguageResultExecution timeMemory
1332822FaggiThe Potion of Great Power (CEOI20_potion)C++20
38 / 100
3072 ms43356 KiB
#include <bits/stdc++.h>
#define ll int
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

const int MAXN = 1e5 + 1;
const int SQ=318;
const int has=1000;
const int tam=(MAXN+MAXN-1)/SQ;
ll h[MAXN], n;
void init(int N, int D, int H[])
{
    ll i;
    for (i = 0; i < N; i++)
        h[i] = H[i];
    n=N;
}
vector<pair<ll,ll>>ars[MAXN];
unordered_map<ll,ll> ma;
unordered_map<ll,set<ll>>grafo;
void curseChanges(int U, int A[], int B[])
{
    ll i, j, k;
    for(i=0; i<U; i++) 
    {
        ars[A[i]].pb({B[i],i});
        ars[B[i]].pb({A[i],i});
    }
    for(i=0; i<n; i++)
    {
        for(j=0; j<sz(ars[i]); j++)
        {
            k=j/SQ;
            if(ma[i*has+k]==0&&k>0)
                grafo[i*has+k]=grafo[i*has+k-1];
            ma[i*has+k]=ars[i][j].se+1;
            auto it=grafo[i*has+k].find(ars[i][j].fr);
            if(it==grafo[i*has+k].end())
                grafo[i*has+k].insert(ars[i][j].fr);
            else
                grafo[i*has+k].erase(it);
        }
    }
}

ll k, ul, j, mi, ant, i;
vector<ll>retX,retY;
set<ll>adyX;
int question(int x, int y, int v)
{
    v--;
    retX.clear();
    retY.clear();
    auto calc=[&]()
    {
        adyX.clear();
        k=0, ul=-1;
        for(k; k<=(sz(ars[x])-1)/SQ; k++)
        {
            if(ma[x*has+k]-1>v)
                break;
            ul=k;
        }
        if(ul>=0)
            adyX=grafo[x*has+ul];
        for(j=SQ*(ul+1); j<min(sz(ars[x]),SQ*(ul+2)); j++)
        {
            if(ars[x][j].se<=v)
            {
                auto it=adyX.find(ars[x][j].fr);
                if(it==adyX.end())
                    adyX.insert(ars[x][j].fr);
                else
                    adyX.erase(it);
            }
            else
                break;
        }
        for(auto &k:adyX)
            retX.pb(h[k]);
        sort(all(retX));
    };
    mi = 1e9, ant=-1;

    calc();
    if(sz(retX) == 0)
        return mi;
    swap(x,y);
    swap(retX,retY);
    calc();

    if(sz(retX) == 0)
        return mi;

    j=0;
    for(i=0; i<sz(retX); i++)
    {
        while(j+1<sz(retY)&&retY[j+1]<retX[i])
            j++;
        mi=min(mi,abs(retY[j]-retX[i]));
        if(j+1<sz(retY))
            mi=min(mi,abs(retY[j+1]-retX[i]));
    }
    return mi;
}
#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...