제출 #896624

#제출 시각아이디문제언어결과실행 시간메모리
896624DenkataBirthday gift (IZhO18_treearray)C++14
100 / 100
865 ms102356 KiB
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 2e5+3;
vector <int> v[maxn];
int tin[maxn],tout[maxn];
vector <int> up[maxn];
int timer,i,j,p,q,n,m,k,l,Q,a[maxn];

void dfs(int u,int p)
{
    int i;
    tin[u]=++timer;
    up[u][0]=p;
    for(i=1;i<=l;i++)
    {
        up[u][i]=up[up[u][i-1]][i-1];
    }
    for(i=0;i<v[u].size();i++)
    {
        int q=v[u][i];
        if(q!=p)
        {
            dfs(q,u);
        }
    }
    tout[u]=++timer;
}
bool upper(int a,int b)
{
    return (tin[a]<=tin[b] && tout[a]>=tout[b]);
}
int lca(int a,int b)
{
    if(upper(a,b))return a;
    if(upper(b,a))return b;
    for(i=l;i>=0;i--)
    {
        if(!upper(up[a][i],b))
            a=up[a][i];
    }
    return up[a][0];
}
set <int> s[maxn],s2[maxn];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>m>>Q;
    l=1;
    while((1<<l)<=n)
        l++;
    for(i=1;i<n;i++)
    {
        cin>>p>>q;
        v[p].push_back(q);
        v[q].push_back(p);
    }
    for(i=0;i<=n+1;i++)
        up[i].resize(l+10);
    tout[0]=100000000;
    dfs(1,1);
    for(i=1;i<=m;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        s2[a[i]].insert(i);
        if(i+1<=m)
            s[lca(a[i],a[i+1])].insert(i);
    }
    while(Q--)
    {
        int type;
        cin>>type;
        if(type==1)
        {
            cin>>p>>q;
            s2[a[p]].erase(p);
            if(p+1<=m)
                s[lca(a[p],a[p+1])].erase(p);
            if(p-1>=1)
                s[lca(a[p-1],a[p])].erase(p-1);


            s2[q].insert(p);
            a[p] = q;
            if(p+1<=m)
                s[lca(a[p],a[p+1])].insert(p);
            if(p-1>=1)
                s[lca(a[p-1],a[p])].insert(p-1);
        }
        else
        {
            int l,r,vv;
            cin>>l>>r>>vv;
            auto it = s2[vv].lower_bound(l);
            if(it!=s2[vv].end() && (*it)<=r)///nqma takuv ili ne vliza v [l;r]
            {
                cout<<*it<<" "<<*it<<endl;
                continue;
            }
            else
            {
                it = s[vv].lower_bound(l);
                if(it!=s[vv].end() && (*it)+1<=r)
                {
                    cout<<*it<<" "<<(*it)+1<<endl;
                    continue;
                }
            }
            cout<<"-1 -1"<<endl;
        }
    }
    return 0;
}
/*
5 4 4
1 2
3 1
3 4
5 3
4 5 2 3
2 1 3 1
1 3 5
2 3 4 5
2 1 3 1
*/

컴파일 시 표준 에러 (stderr) 메시지

treearray.cpp: In function 'void dfs(int, int)':
treearray.cpp:19:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(i=0;i<v[u].size();i++)
      |             ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...