这板子也能打挂???help
查看原帖
这板子也能打挂???help
685034
dqo_opb楼主2023/9/1 15:06

咱就是说看不出哪里错了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
inline int read(){
    int x = 0,f = 1;char c = getchar();
    for(;!isdigit(c);c = getchar())if(c == '-')f = -1;
    for(;isdigit(c);c = getchar())x = ( x << 1 ) + ( x << 3 ) + c - '0';
    return x * f;
}
int n,tot,nod,root[N * 30];
struct node{
    int l,r,siz;
    char data;
}tr[N * 30];
#define ls tr[x].l
#define rs tr[x].r
inline void pushup(int x){
    tr[x].siz = tr[ls].siz + tr[rs].siz;
}
inline void insert(int &x,int pre,int l,int r,char data){
    x = ++tot;
    tr[x].l = tr[pre].l;
    tr[x].r = tr[pre].r;
    tr[x].siz = tr[pre].siz;
    tr[x].data = tr[pre].data;
    if(l > r)return;
    if(l == r){
        tr[pre].data = data;
        tr[pre].siz = 1;
        return;
    }
    int mid = ( l + r ) >> 1;
    if( tr[ls].siz == mid - l + 1 )insert(rs,tr[pre].r,mid + 1,r,data);
    else insert(ls,tr[pre].l,l,mid,data);
    pushup(x);
}
inline char query(int x,int l,int r,int k){
    if(l >= r)return tr[x].data;
    int mid = ( l + r ) >> 1;
    if( k <= tr[ls].siz )return query(ls,l,mid,k);
    else return query(rs,mid + 1,r,k - tr[ls].siz);
}
int main(){
    n = read();
    for(int i = 1;i <= n;i ++){
        int x;
        char ch,opt;
        opt = getchar();
        if(opt == 'T'){
            cin >> ch;
            nod ++;
            insert(root[nod],root[nod - 1],1,n,ch);
        }
        if(opt == 'U'){
            x = read();
            nod ++;
            root[nod] = root[nod - x - 1];
        }
        if(opt == 'Q'){
            x = read();
            cout << query(root[nod],1,n,x) << endl;
        }
    }
    return 0;
}
2023/9/1 15:06
加载中...