线段树水过
没有什么问题是线段树解决不了的!!!包括a+b problem 。 ---------lmrttx
题目传送门:题目
分析:查询操作可以看成在
m
−
l
+
1
m-l+1
m−l+1 到
m
m
m 这一段区间中取最值,所以,线段树就可以使用了。插入操作就直接暴力线段树操作就行了。
CODE by lmrttx:
#include<bits/stdc++.h>
#define ll long long
#define inf -100000000000
using namespace std;
int m,cnt;
ll mod,x,t,tree[2000010*4];
char op[2];
void add(int s,int k,int id,int l,int r){
if(l==r){tree[id]=k;return;}
int mid=(l+r)>>1;
if(mid>=s)add(s,k,id<<1,l,mid);
if(mid<s)add(s,k,id<<1|1,mid+1,r);
tree[id]=max(tree[id<<1],tree[id<<1|1])%mod;
}
ll ask(int l1,int r1,int id,int l,int r){
if(l1<=l&&r1>=r){return tree[id];}
int mid=(l+r)>>1;
ll xx=inf,yy=inf;
if(mid>=l1)xx=ask(l1,r1,id<<1,l,mid);
if(mid<r1)yy=ask(l1,r1,id<<1|1,mid+1,r);
return xx>yy ? xx : yy;
}
int main(){
scanf("%d%lld",&m,&mod);
for(register int i=1;i<=m;i++){
scanf("%s%lld",op,&x);
switch (op[0]) {
case 'Q':
if(x==0)t=0;
else t=ask(cnt-x+1,cnt,1,1,m)%mod;
printf("%lld\n",t);
break;
case 'A':
add(cnt+1,(x+t)%mod,1,1,m);
cnt++;
break;
}
}
return 0;
}
谢谢阅读,蒟蒻是真的不会线段树。