58分求助
查看原帖
58分求助
25728
F3_Dy楼主2021/9/1 17:01
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define int long long
using namespace std;
int n,m;
struct nod
{
    int l,r;
};
int vl[10000010];
vector<nod>d;
int rt[10000010];
void build(int l,int r)
{
    if(l==r)
    {
        d.push_back((nod){vl[l],vl[l]});
        return;
    }
    int i=d.size();
    d.push_back((nod){i+1,0});
    build(l,(l+r>>1));
    d[i].r=d.size();
    build((l+r>>1)+1,r);
}
void chang(int ver,int p,int v)
{
    int l=1,r=n,mid,i=d.size(),j=rt[ver];
    while(l<r)
    {
        i++;
        mid=(l+r>>1);
        if(p<=mid)
        {
            r=mid;
            d.push_back((nod){i,d[j].r});
            j=d[j].l;
        }
        else
        {
            l=mid+1;
            d.push_back((nod){d[j].l,i});
            j=d[j].r;
        }
    }
    d.push_back((nod){v,v});
}
int query(int ver,int p)
{
    int l=1,r=n,mid,j=rt[ver];
    while(l<r)
    {
        mid=(l+r>>1);
        if(p<=mid)
        {
            r=mid;
            j=d[j].l;
        }
        else
        {
            l=mid+1;
            j=d[j].r;
        }
    }
    return d[j].l;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&vl[i]);
    }
    build(1,n);
    for(int i=1;i<=m;i++)
    {
        int ver,op,x,y;
        scanf("%lld%lld%lld",&ver,&op,&x);
        if(op==1)
        {
            scanf("%lld",&y);
            rt[i]=d.size();
            chang(ver,x,y);
        }
        if(op==2)
        {
            rt[i]=rt[i-1];
            printf("%lld\n",query(ver,x));
        }
    }
    return 0;
}

RT

58分还看不到别人代码qwq

2021/9/1 17:01
加载中...