求卡常
查看原帖
求卡常
704275
无名之雾楼主2025/1/27 10:37

拼尽全力无法突破 70分

#include<bits/stdc++.h>
using namespace std;
#define ll long long
/*#define int long long
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
inline void write(int x){
    if(x==0){putchar('0');return;}
    int len=0,k1=x,c[10005];
    if(k1<0)k1=-k1,putchar('-');
    while(k1)c[len++]=k1%10+'0',k1/=10;
    while(len--)putchar(c[len]);
}*/
char buf[1<<21],*p1=buf,*p2=buf;inline int getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}template <typename T>inline void redi(T& ret){ret=0;int f=1;char ch;do{ch=getc();ch=='-'?f=-1:f;}while(ch<'0'||ch>'9');while (ch>='0'&&ch<='9'){ret=(ret<<1)+(ret<<3)+ch-48;ch=getc();}ret*=f;}template <typename T,typename... Args> inline void redi(T& t, Args&... args){redi(t);redi(args...);}char buffer[1 << 21];int p3=-1;const int p4=(1<<21)-1;inline void flush(){fwrite(buffer,1,p3+1,stdout),p3=-1;}inline void putc(const char &x){if(p3==p4)flush();buffer[++p3]=x;}template <typename T>inline void wrtn(T x){static char buf[15];static int len=-1;if(x>=0){do{buf[++len]=x%10+48,x/=10;}while(x);}else{putc('-');do{buf[++len]=-(x%10)+48,x/=10;}while(x);}while (len>=0)putc(buf[len]),--len;putc('\n');flush();}template <typename T,typename... Args> inline void wrtn(T t,Args ... args){wrtn(t);wrtn(args...);}
const int N=2e5+5;
ll a[N],ans[N];int pre[N];
mt19937 mt(time(0));
struct FHQ_treap{
    struct Tr{int wt;ll val;int ch[2],fa;}tr[N];
    struct Tag{bool rev;ll ai;}tag[N];
    int sz,rt;
    void push_up(int x){
        if(tr[x].ch[0])tr[tr[x].ch[0]].fa=x;
        if(tr[x].ch[1])tr[tr[x].ch[1]].fa=x;
        tr[x].fa=0;
    }
    int newnode(ll val){
        tr[++sz]={mt(),val,{0,0},0};
        tag[sz]={0,0};return sz;
    }
    void tagon(int x,Tag k){
        if(k.rev){
            swap(tr[x].ch[0],tr[x].ch[1]);
            tr[x].val=-tr[x].val;
            tag[x].rev^=k.rev;
            tag[x].ai*=-1;
        }
        if(k.ai){
            tr[x].val+=k.ai;
            tag[x].ai+=k.ai;
        }
    }
    void push_down(int x){
        if(tr[x].ch[0])tagon(tr[x].ch[0],tag[x]);
        if(tr[x].ch[1])tagon(tr[x].ch[1],tag[x]);
        tag[x]={0,0};
    }
    void split(int x,ll k,int &L,int &R){
        if(!x){L=R=0;return ;}
        push_down(x);
        if(tr[x].val<=k)L=x,split(tr[x].ch[1],k,tr[L].ch[1],R);
        else R=x,split(tr[x].ch[0],k,L,tr[x].ch[0]);
        push_up(x);
    }
    int merge(int x,int y){
        if(!x||!y)return x|y;
        push_down(x),push_down(y);
        push_up(x),push_up(y);
        if(tr[x].wt<tr[y].wt){
            tr[x].ch[1]=merge(tr[x].ch[1],y);
            push_up(x);return x;
        }
        else{
            tr[y].ch[0]=merge(x,tr[y].ch[0]);
            push_up(y);return y;
        }
    }
    int mergex(int x,int y){
        if(!x||!y)return x|y;
        push_down(x),push_down(y);
        if(tr[x].wt<tr[y].wt)swap(x,y);
        int yX,yY;split(y,tr[x].val,yX,yY);
        tr[x].ch[0]=mergex(tr[x].ch[0],yX);
        tr[x].ch[1]=mergex(tr[x].ch[1],yY);
        push_up(x);return x;
    }
    pair<int,int>insert(ll val){
        int x,y,w;
        split(rt,val,x,y);
        w=newnode(val);
        return {rt=merge(merge(x,w),y),w};
    }
    int update(ll k,Tag tg){
        int x,y;
        split(rt,k,x,y);
        tagon(x,tg);
        return rt=mergex(x,y);
    }
    void get_ans(int u){
        if(u==0)return;
        get_ans(tr[u].fa);
        push_down(u);
    }
}fhq;
vector<pair<ll,int>>vl[N];vector<int>vr[N];
signed main(){
    int n,q;redi(n,q);
    for(int i=1;i<=n;i++)redi(a[i]);
    for(int i=1;i<=q;i++){
        ll x;int l,r;redi(x,l,r);
        vl[l].push_back({x,i});vr[r].push_back(i);
    }
    for(int i=1;i<=n;i++){
        for(pair<ll,int> v:vl[i]){
            ll x=v.first;int id=v.second;
            pre[id]=fhq.insert(x).second;
        }
        fhq.update(a[i]>>1,{1,a[i]});
        for(int j:vr[i]){
            fhq.get_ans(pre[j]);
            ans[j]=fhq.tr[pre[j]].val;
        }
    }
    for(int i=1;i<=q;i++)wrtn(ans[i]);
    return 0;
}
2025/1/27 10:37
加载中...