標籤:查詢 size char max poi UI int fine read
題目描述
現在請求你維護一個數列,要求提供以下兩種操作:
1、 查詢操作。
文法:Q L
功能:查詢當前數列中末尾L個數中的最大的數,並輸出這個數的值。
限制:L不超過當前數列的長度。
2、 插入操作。
文法:A n
功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對一個固定的常數D模數,將所得答案插入到數列的末尾。
限制:n是整數(可能為負數)並且在長整範圍內。
注意:初始時數列是空的,沒有一個數。
輸入輸出格式
輸入格式:
第一行兩個整數,M和D,其中M表示操作的個數(M <= 200,000),D如上文中所述,滿足(0<D<2,000,000,000)
接下來的M行,每行一個字串,描述一個具體的操作。文法如上文所述。
輸出格式:
對於每一個查詢操作,你應該按照順序依次輸出結果,每個結果佔一行。
輸入輸出範例
輸入範例#1:
5 100A 96Q 1A 97Q 1Q 2
輸出範例#1:
969396
說明
[JSOI2008]
思路的話。
首先衝著最大值
建一顆空樹
然後加入就是單點修改
查詢就是插後面的m位。。。。
但是這題在洛穀上AC
在COGS上爆零
-.-
還有就是不能開讀入最佳化
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #define lglg long long int 6 using namespace std; 7 const int n=200001; 8 lglg mod,m; 9 struct node10 {11 lglg l,r,w;12 }tree[n*4];13 lglg num=1;14 lglg last=0;15 lglg ans=-1;16 void updata(int k)17 {18 tree[k].w=max(tree[k*2].w,tree[k*2+1].w);19 }20 void build(int ll,int rr,int k)21 {22 tree[k].l=ll;tree[k].r=rr;23 if(tree[k].l==tree[k].r)24 {25 tree[k].w=0;26 return ;27 }28 int m=(ll+rr)/2;29 build(ll,m,k*2);30 build(m+1,rr,k*2+1);31 updata(k);32 }33 int read(lglg &x)34 {35 int flag=0;36 char c=getchar();x=0;37 if(c==‘-‘)flag=1;38 while(c<‘0‘||c>‘9‘)c=getchar();39 while(c>=‘0‘&&c<=‘9‘)x=x*10+c-48,c=getchar();40 return flag==1?x=-x:x; 41 }42 void point_add(int where,int p,int k)43 {44 if(tree[k].l==tree[k].r)45 {46 tree[k].w=p;47 return ;48 }49 int m=(tree[k].l+tree[k].r)/2;50 if(where<=m)51 point_add(where,p,k*2);52 else53 point_add(where,p,k*2+1);54 updata(k); 55 }56 void interval_ask(int ll,int rr,int k)57 {58 if(ll<=tree[k].l&&rr>=tree[k].r)59 {60 if(ans<tree[k].w)ans=tree[k].w;61 return ;62 }63 int m=(tree[k].l+tree[k].r)/2;64 if(ll<=m)65 interval_ask(ll,rr,k*2);66 if(rr>=m+1)67 interval_ask(ll,rr,k*2+1);68 }69 int main()70 {71 //read(m);read(mod);72 cin>>m>>mod;73 build(1,n,1);74 for(int i=1;i<=m;i++)75 {76 char c;77 cin>>c;78 if(c==‘A‘)79 {80 lglg p;81 //read(p);82 cin>>p;83 p=(p+last)%mod;84 point_add(num++,p,1);85 }86 else87 {88 lglg p;89 ans=-1;90 //read(p);91 cin>>p;92 interval_ask(num-p,num-1,1);93 last=ans%mod;94 printf("%lld\n",ans);95 }96 }97 return 0;98 }
P1198 [JSOI2008]最大數