Submission #866114

#TimeUsernameProblemLanguageResultExecution timeMemory
866114vnm06The Potion of Great Power (CEOI20_potion)C++14
100 / 100
2294 ms150140 KiB
#include<bits/stdc++.h>
using namespace std;
 
int n, h[1000005];
 
void init(int N, int D, int H[]) 
{
    n=N;
    for(int i=0; i<n; i++) h[i]=H[i];
}
 
map<pair<int, int>, int> globalmp;
 
vector<pair<int, int> > st[2000000];
 
void update(int v, int le, int ri, int be, int en, int st1, int st2)
{
    if(le>en || ri<be) return;
    if(be<=le && ri<=en)
    {
        st[v].push_back({st1, st2});
        st[v].push_back({st2, st1});
        return;
    }
    int mid=(le+ri)/2;
    update(2*v, le, mid, be, en, st1, st2);
    update(2*v+1, mid+1, ri, be, en, st1, st2);
}
 
void curseChanges(int U, int A[], int B[]) 
{
    for(int i=0; i<U; i++)
    {
        if(A[i]>B[i]) swap(A[i], B[i]);
        map<pair<int, int>, int>::iterator it=globalmp.find({A[i], B[i]});
        if(it!=globalmp.end())
        {
            update(1, 0, 2e5+1, (*it).second, i, A[i], B[i]);
            globalmp.erase(it);
        }
        else
        {
            globalmp[{A[i], B[i]}]=i+1;
        }
    }
    map<pair<int, int>, int>::iterator it=globalmp.begin();
    while(it!=globalmp.end())
    {
        update(1, 0, 2e5+1, (*it).second, U, (*it).first.first, (*it).first.second);
        it++;
    }
    for(int i=0; i<2000000; i++) sort(st[i].begin(), st[i].end());
}
 
vector<int> vect[2];
 
void query(int v, int le, int ri, int day, int ch, int id)
{
    while(1)
    {
        int nle=-1, nri=st[v].size();
        while(nri-nle>1)
        {
            int mid=(nle+nri)/2;
            if(st[v][mid].first<ch) nle=mid;
            else nri=mid;
        }
        while(nri<st[v].size() && st[v][nri].first==ch)
        {
            vect[id].push_back(st[v][nri].second);
            nri++;
        }
        if(le==ri) return;
        int mid=(le+ri)/2;
        if(day<=mid)
        {
            v=2*v;
            ri=mid;
        }
        else
        {
            v=2*v+1;
            le=mid+1;

        }
    }
}
 
int question(int x, int y, int v) 
{
    vect[0].resize(0);
    vect[1].resize(0);
    query(1, 0, 2e5+1, v, x, 0);
    query(1, 0, 2e5+1, v, y, 1);
    int s1=vect[0].size(), s2=vect[1].size(), id1=0, id2=0;
    for(int i=0; i<s1; i++) vect[0][i]=h[vect[0][i]];
    for(int i=0; i<s2; i++) vect[1][i]=h[vect[1][i]];
    sort(vect[0].begin(), vect[0].end());
    sort(vect[1].begin(), vect[1].end());
    int tekd=1e9;
    while(id1<s1 && id2<s2)
    {
        int dist=vect[0][id1]-vect[1][id2];
        if(dist<0)
        {
            id1++;
            dist=-dist;
            if(dist<tekd) tekd=dist;
        }
        else
        {
            id2++;
            if(dist<tekd) tekd=dist;
        }
    }
    return tekd;
}

Compilation message (stderr)

potion.cpp: In function 'void query(int, int, int, int, int, int)':
potion.cpp:68:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         while(nri<st[v].size() && st[v][nri].first==ch)
      |               ~~~^~~~~~~~~~~~~
#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...