Submission #1178315

#TimeUsernameProblemLanguageResultExecution timeMemory
1178315kokoue원숭이와 사과 나무 (IZhO12_apple)C++17
0 / 100
411 ms290420 KiB
#include<bits/stdc++.h>
#define f first
#define s second
#define ll long long
using namespace std;
const ll maxn =1e9;
int m;
struct Node
{
    int cntr=0;
    bool lazy=0;
    int l,r;
    Node *left=nullptr;
    Node *right=nullptr;
};
Node *root;

void extendleft(Node *node)
{
    if(node->left==nullptr && node->l!=node->r)
    {
        int mid=(node->l+node->r)/2;
        node->left=new Node();
        node->left->l=node->l;
        node->left->r=mid;
        node->left->lazy=node->lazy;
    }
}
void extendright(Node *node)
{
    if(node->right==nullptr && node->l!=node->r)
    {
        int mid=(node->l+node->r)/2;
        node->right=new Node();
        node->right->l=mid+1;
        node->right->r=node->r;
        node->right->lazy=node->lazy;
    }
}
void extend(Node *node)
{
    extendleft(node);
    extendright(node);
   // printf("out of extend\n");
}
void pushLazy(Node *node)
{
    if(node->lazy)
    {
        node->cntr=node->r-node->l+1;
        extend(node);
        if(node->l!=node->r)
        {
            node->left->lazy=1;
            node->right->lazy=1;
        }
        //node->lazy=0;
    }
}
void update(int ul,int ur,Node *node)
{
  //  printf("in update %d %d\n",node->l,node->r);
  //pushLazy(node);
    if(ur<node->l || node->r<ul) return;
    pushLazy(node);
    if(ul<=node->l && node->r<=ur)
    {
       // printf("doing hole with %d %d\n",node->l,node->r);
        node->cntr=node->r-node->l+1;

        extend(node);
        if(node->l!=node->r)
        {
            node->left->lazy=1;
            node->right->lazy=1;
        }
       // printf("finishing whole %d %d\n",node->l,node->r);
        return;
    }
    int mid=(node->l+node->r)/2;
    if(ul<=mid) extendleft(node);
    if(ur>mid) extendright(node);
    if(node->left!=nullptr) update(ul,ur,node->left);
    if(node->right!=nullptr) update(ul,ur,node->right);
    if(node->lazy) return;
    node->cntr=0;
    if(node->left!=nullptr)
    {
        if(node->left->lazy) node->cntr+=node->left->r-node->left->l+1;
        else node->cntr+=node->left->cntr;
    }
    if(node->right!=nullptr)
    {
        if(node->right->lazy) node->cntr+=node->right->r-node->right->l+1;
        else node->cntr+=node->right->cntr;
    }
}
int query(int ql,int qr,Node *node)
{
    //pushLazy(node);
    if(qr<node->l || node->r<ql) return 0;
    pushLazy(node);
    if(ql<=node->l && node->r<=qr)
    {
        if(node->lazy) return node->r-node->l+1;
        return node->cntr;
    }
    int mid=(node->l+node->r)/2;
    if(ql<=mid) extendleft(node);
    if(qr>mid) extendright(node);
    int ans=0;
    if(node->left!=nullptr) ans+=query(ql,qr,node->left);
    if(node->right!=nullptr) ans+=query(ql,qr,node->right);
    return ans;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>m;
    root=new Node();
    root->l=1;
    root->r=maxn;
    ll c=0;
    for(int i=0;i<m;i++)
    {
      //  printf("in query %d\n",i);
        int t,x,y;
        cin>>t>>x>>y;
        if(t==1)
        {
            c=query(x+c,y+c,root);
            cout<<c<<"\n";

        }
        if(t==2)
        {
            update(x+c,y+c,root);

        }
    }
}
/*
3
2 5 8
2 7 10
1 1 10
*/
#Verdict Execution timeMemoryGrader output
Fetching results...