Submission #993444

#TimeUsernameProblemLanguageResultExecution timeMemory
993444Drifter24Monkey and Apple-trees (IZhO12_apple)C++14
0 / 100
363 ms166260 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Node{
	ll sum;
	int l,r,ptr,ptrl,ptrr;
};

struct SegTree{
	int size;
	vector<Node> vals;
	vector<ll> lazy;
	ll null=0;

	void oper(int x){
		vals[x].sum=vals[vals[x].ptrl].sum+vals[vals[x].ptrr].sum;
	}

	void extends(int x){
		int m=vals[x].l+(vals[x].r-vals[x].l)/2;
		if(vals[x].ptrl==-1){
			vals[x].ptrl=vals.size();
			vals.push_back({0,vals[x].l,m,vals[x].ptrl,-1,-1});
			lazy.push_back(0);
		}
		if(vals[x].ptrr==-1){
			vals[x].ptrr=vals.size();
			vals.push_back({0,m,vals[x].r,vals[x].ptrr,-1,-1});
			lazy.push_back(0);
		}
	}

	void build(int n){
		size=n;
		vals.push_back({0,1,n+1,0,-1,-1});
		lazy.push_back(0);
	}

    void propagate(int x){
		if(vals[x].r-vals[x].l==1)return;
        if(lazy[x]==0)return;
		extends(x);
		int m=vals[x].l+(vals[x].r-vals[x].l)/2;
		lazy[vals[x].ptrl]|=lazy[x];
		lazy[vals[x].ptrr]|=lazy[x];
		vals[vals[x].ptrl].sum=(m-vals[x].l);
		vals[vals[x].ptrr].sum=(vals[x].r-m);
		lazy[x]=0;
    }

    void upd(int l, int r, ll v,int x){
        propagate(x);
		int lx=vals[x].l, rx=vals[x].r;
		if(lx>=r || l>=rx)return;
		if(lx>=l && rx<=r){
            lazy[x]=1;
			vals[x].sum=(rx-lx);
            return;
        }
		int m=(lx+rx)/2;
		extends(x);
		upd(l,r,v,vals[x].ptrl);
		upd(l,r,v,vals[x].ptrr);
		oper(x);
	}

	ll get(int l, int r, int x){
        propagate(x);
		int lx=vals[x].l, rx=vals[x].r;
		if(lx>=r || l>=rx)return null;
		if(lx>=l && rx<=r)return vals[x].sum;
		extends(x);
		ll v1=get(l,r,vals[x].ptrl);
		ll v2=get(l,r,vals[x].ptrr);
		return v1+v2;
	}

	void upd(int l, int r, ll v){upd(l,r+1,v,0);}
	ll get(int l, int r){return get(l,r+1,0);}
};

int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);
	int q;
	cin>>q;
	SegTree st;
	st.build(1e7);
	int t,l,r;
	ll c=0;
	while(q--){
		cin>>t>>l>>r;
		if(t==1){
			c=st.get(c+l,c+r);
			cout<<c<<"\n";
		}else{
			st.upd(c+l,c+r,1);
		}
	}
	return 0;
}

Compilation message (stderr)

apple.cpp: In member function 'void SegTree::upd(int, int, ll, int)':
apple.cpp:61:7: warning: unused variable 'm' [-Wunused-variable]
   61 |   int m=(lx+rx)/2;
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...