luoguP3822 [NOI2017]整数

#include<set>
#include<iostream>
using namespace std;
typedef unsigned int ui;
const int N=9999999;
int n,t1,t2,t3,tp,a,b,k;
ui zh[N],fu[N];
set<int> ss;
inline void add(int cnt,int pos,int val)
{
    if(val>0)
    {
    	ui ji=(val>>(31-pos)),pre=zh[cnt];
        ji>>=1;zh[cnt]+=(val<<pos);ji+=(pre>zh[cnt]);
    	if(zh[cnt]!=fu[cnt])ss.insert(cnt);
    	else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
        cnt++;
    	while(ji)
    	{
    		pre=zh[cnt];zh[cnt]+=ji;ji=(pre>zh[cnt]);
    		if(zh[cnt]!=fu[cnt])ss.insert(cnt);
    		else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
    		cnt++;
        }
    }
    else if(val<0)
    {
        val=-val;
        ui ji=(val>>(31-pos)),pre=fu[cnt];
        ji>>=1;fu[cnt]+=(val<<pos);ji+=(pre>fu[cnt]);
    	if(zh[cnt]!=fu[cnt])ss.insert(cnt);
    	else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
        cnt++;
    	while(ji)
    	{
    		pre=fu[cnt];fu[cnt]+=ji;ji=(pre>fu[cnt]);
    		if(zh[cnt]!=fu[cnt])ss.insert(cnt);
    		else if(ss.find(cnt)!=ss.end())ss.erase(cnt);
    		cnt++;
        }
    }
}
inline int query(int cnt,int pos)
{
    int v1=(zh[cnt]%(1<<pos)),v2=(fu[cnt]%(1<<pos)),ans=((zh[cnt]>>pos)^(fu[cnt]>>pos))&1;
    if(v1<v2)return (ans^1);
    if(v1>v2 or ss.empty() or cnt<=*(ss.begin())){return ans;}
    set<int>::iterator it=ss.lower_bound(cnt);	--it;
    if(zh[*it]>fu[*it])return ans;
    return (ans^1);
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>t1>>t2>>t3;
    while(n--)
    {
        cin>>tp;
        switch(tp)
        {
            case 1:{cin>>a>>b;add(b>>5,b-((b>>5)<<5),a);break;}
            default:{cin>>k;cout<<query(k>>5,k-((k>>5)<<5))<<endl;break;}
        }
    }
}
原文地址:https://www.cnblogs.com/Ace-MYX/p/10364122.html