# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
848600 | Darren0724 | 원숭이와 사과 나무 (IZhO12_apple) | C++17 | 245 ms | 81328 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
struct segtree{
struct seg{
int lz,val,lc,rc;
};
vector<seg> v;
int cnt1=0;
int New(){
return cnt1++;
}
segtree(){
New();
v.resize(5000000,{0,0,-1,-1});
}
int rv(seg &s,int l,int r){
return (s.lz?r-l:s.val);
}
void check(seg &s){
if(s.lc==-1){
s.lc=New();
}
if(s.rc==-1){
s.rc=New();
}
}
void push(seg &s){
v[s.lc].lz|=s.lz;
v[s.rc].lz|=s.lz;
}
void pull(seg &s,int l,int m,int r){
s.val=rv(v[s.lc],l,m)+rv(v[s.rc],m,r);
}
void add(seg &s,int a,int b,int l,int r){
if(a<=l&&b>=r){
s.lz=1;
return;
}
check(s);
push(s);
int m=(l+r)>>1;
if(a<m){
add(v[s.lc],a,b,l,m);
}
if(b>m){
add(v[s.rc],a,b,m,r);
}
pull(s,l,m,r);
}
int ask(seg &s,int a,int b,int l,int r){
if(a<=l&&b>=r){
return rv(s,l,r);
}
int m=(l+r)>>1;
int ans=0;
check(s);
push(s);
if(a<m){
ans+=ask(v[s.lc],a,b,l,m);
}
if(b>m){
ans+=ask(v[s.rc],a,b,m,r);
}
pull(s,l,m,r);
return ans;
}
};
int32_t main() {
int n;cin>>n;
segtree tr;
int ans=0;
const int p=1e9+1;
for(int i=0;i<n;i++){
int id;cin>>id;
if(id==2){
int a,b;cin>>a>>b;
a+=ans,b+=ans;
tr.add(tr.v[0],a,b+1,0,p);
}
else{
int a,b;cin>>a>>b;
a+=ans,b+=ans;
ans=tr.ask(tr.v[0],a,b+1,0,p);
cout<<ans<<endl;
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |