トピック:
列車がUOJに属して管理するために使用される鉄道駅、ありますUOJ。
N-の合計を訓練
N-
作品は1、...、N-番
1、...、N-
のみによる特殊な構造に電車のレールの一端、電車を保持するために使用される、各鉄道車両が駐車することができます無数の小さな電車を。各鉄道は、互いに独立しています。
駐車列車が最初にすることができた後の鉄道は、スタック構造です。
電車あたりのトン数は、T持っ
トンを
。
NOI2016が来ているので、あなたは一日あたりのイベントの多くに対処するための小さなフロントの人を戦って、駅の管理者9人の貧弱なニーズに訓練したいと思います。
:イベントの約3種類のように要約することができる
誰かが[L、R]で鉄道番号に望んでいる•1 LR
[L、R]
小さな正の各鉄道は、最初の列車の戦いのうち、缶を開け、あなたはこれらの統計を訓練する必要がありますトン数と無鉄道列車が答えに含まれていません。
•2リットル番号Lの
Lの
鉄道が出ない列車でない場合鉄道列車を追い払いました。
[L、R]で•3 LRX鉄道番号
[L、R]
各鉄道のは、Xの新しい公園のトン数である
X-の
列車。
今、彼のためにあなたは電車の駅を管理する必要があり、南シナ海の最前線に行くために9貧しい人々を管理者。
忙しい鉄道駅として、あなたはリアルタイムのフィードバックを必要とするので、我々は、特定の入力フォーマットを参照してください、オンライン強制的にいくつかの手段を使用する必要がします。
入力形式
最初の行3つの非負整数N-、M、TYの入力
N-、M、TYは、
操作回数や鉄道線路のと必須かどうか数を表します。
続いて、m個の
m個の
3つの数字または4つの数字または2つの数の行が単一の操作を表します。
リアルタイムのフィードバック情報のために、あなたは、L、R&LT復号化する必要が
L、R&LTを
、提供されるリードL1、R1
、L1、R1
、実際の値は以下の通りであります:
==== L2r2lr(L1 +Lastans⋅ty)MODN + 1(R1 +Lastans⋅ty)MODN +見1分(L2、R2)によってMAX(L2、R2)
L2 =(L1 +Lastans⋅ty)MODN + 1R2(= R1 +lastans⋅ty)MODN + 1リットル=分(L2、R2)R = MAX(L2、R2)
lastansは
lastans
尋ねる前または0でない場合は、一度表すクエリに対する答えを
0
。
あなたが操作の第二のタイプなので、唯一= L(L1 +lastans⋅ty)MODN。1 +行う場合
L =(L1 +lastans⋅ty)MODN + 1
にします。
1≤l1、r1≤n確保するための入力データ
1≤l1、r1≤nを
。
我々はトン数と操作のタイプを暗号化していないことに注意してください
出力フォーマット
お問い合わせの各出力ラインのために、非負整数の答え。
サンプル
入力
10 10 0
3 1 5 3
1 1 6
3 7 1 1
1 1 9
1 1 6
3 1 5 2
1 3 6
1 3 9
3 1 7 6
2 1
出力
15
7
6
7
8
http://uoj.ac/problem/218
ソリューション:
私たちは、時間に対して木の持続可能なセグメントを構築し、スタック列の各レールのトン数とトップの各期間のスタックのスタックトップを維持することができます。
私たちは、統計的な答えのセグメントツリーを維持しましょう。
だから、唯一の3で動作:
お問い合わせの範囲:直接の質問は、セグメントツリーに答えるために。
インターバル圧力:ツリーラインでカバーのためのセクション永続的で、その後、解答セグメントツリーでそれを変更します。
一点爆弾の数:我々は、スタックの時間を記録しているので、時間tへのインバウンドのお問い合わせ、我々は、時間tの前にツリーを照会現在のポイント・スタックの前に、スタックの一番上の情報を見つける、その後、ツリーラインと答えることができます持続性は、ツリーラインを変更することができます。
コード:
#include<iostream>
#include<stdio.h>
#include<string.h>
#define N 500005
#define lson id*2
#define rson id*2+1
using namespace std;
int n,m,sum[N*4],lazy[N*4];
void pd(int id,int l,int r,int mid)
{
if(lazy[id]==-1) return ;
sum[lson]=(mid-l+1)*lazy[id];
sum[rson]=(r-mid)*lazy[id];
lazy[lson]=lazy[rson]=lazy[id];
lazy[id]=-1;
}
void add(int id,int L,int R,int l,int r,int v)
{
//cout<<L<<" "<<R<<" "<<l<<" "<<r<<endl;
if(L>r||R<l) return ;
if(L>=l&&R<=r)
{
lazy[id]=v;
sum[id]=(R-L+1)*v;
return ;
}
int mid=(L+R)>>1;
pd(id,L,R,mid);
add(lson,L,mid,l,r,v);
add(rson,mid+1,R,l,r,v);
sum[id]=sum[lson]+sum[rson];
}
int getans(int id,int L,int R,int l,int r)
{
if(L>r||R<l) return 0;
if(L>=l&&R<=r) return sum[id];
int mid=(L+R)>>1;
pd(id,L,R,mid);
int ret=getans(lson,L,mid,l,r)+getans(rson,mid+1,R,l,r);
return ret;
}
int tim[N*75],val[N*75],tot,ls[N*75],rs[N*75];
int rt[N];
void down(int id)
{
if(tim[id]==-1) return;
++tot;tim[tot]=tim[id];ls[tot]=ls[ls[id]];rs[tot]=rs[ls[id]];ls[id]=tot;val[tot]=val[id];
++tot;tim[tot]=tim[id];ls[tot]=ls[rs[id]];rs[tot]=rs[rs[id]];rs[id]=tot;val[tot]=val[id];
tim[id]=-1;
}
void build(int pre,int &now,int L,int R,int l,int r,int t,int v)
{
now=++tot;
if(L>=l&&R<=r)
{
tim[now]=t;
val[now]=v;
return ;
} //cout<<L<<" "<<R<<" "<<l<<" "<<r<<endl;
if(pre) down(pre);
ls[now]=ls[pre],rs[now]=rs[pre];
int mid=(L+R)>>1;
if(mid>=l) build(ls[pre],ls[now],L,mid,l,r,t,v);
if(mid+1<=r) build(rs[pre],rs[now],mid+1,R,l,r,t,v);
}
int get(int id,int l,int r,int pos)
{
if(!id||tim[id]!=-1) return id;
int mid=(l+r)>>1;
if(pos<=mid) return get(ls[id],l,mid,pos);
return get(rs[id],mid+1,r,pos);
}
void del(int x,int y)
{
int id=get(rt[y-1],1,n,x);
if(!id)
{
rt[y]=rt[y-1];
return ;
}
// if(tim[id]==0) while(1);
id=get(rt[tim[id]-1],1,n,x);
build(rt[y-1],rt[y],1,n,x,x,tim[id],val[id]);
add(1,1,n,x,x,val[id]);
}
void change(int l,int r,int v,int i)
{
build(rt[i-1],rt[i],1,n,l,r,i,v);
add(1,1,n,l,r,v);
}
int ty;
int ans;
int main()
{
scanf("%d%d%d",&n,&m,&ty);
memset(lazy,-1,sizeof(lazy));
memset(tim,-1,sizeof(tim));
for(int i=1,aa,bb,cc,dd;i<=m;i++)
{
scanf("%d",&aa);
if(aa==1)
{
scanf("%d%d",&bb,&cc);
bb=(bb+ans*ty)%n+1;
cc=(cc+ans*ty)%n+1;
if(bb>cc) swap(bb,cc);
ans=getans(1,1,n,bb,cc);
printf("%d\n",ans);
rt[i]=rt[i-1];
}
else if(aa==2)
{
scanf("%d",&bb);
bb=(bb+ans*ty)%n+1;
del(bb,i);
}
else if(aa==3)
{
scanf("%d%d%d",&bb,&cc,&dd);
bb=(bb+ans*ty)%n+1;
cc=(cc+ans*ty)%n+1;
if(bb>cc) swap(bb,cc);
change(bb,cc,dd,i);
}
}
}