洛谷 P1198 最大數
阿新 • • 發佈:2019-02-10
pro define \n efi esp pda show tps %d
傳送門:洛谷 P1198 最大數
算法分析:單點修改,區間查詢最大值,與加法有略微不同,也不必使用懶標記,模板即可
---
#include<iostream> #include<cstdio> #define maxN 200010 #define ls k<<1 #define rs k<<1 | 1 #define mid ((l+r)>>1) using namespace std; typedef long long ll; ll sum[maxN*4+1],D,t; int m,x,tot=0; char op[3]; void pushup(int); ll query(int,int,int,int,int); void update(int,int,int,int,int); int main() { scanf("%d %lld\n",&m,&D); for(int i=1;i<=m;i++) { scanf("%s %d\n",op,&x); if(op[0]==‘A‘) { update(1,1,m,tot+1,(x+t)%D); tot++; } else { t=query(1,1,m,tot-x+1,tot)%D; printf("%lld\n",t); } } return 0; } void pushup(int k) {sum[k]=max(sum[ls],sum[rs]);} void update(int k,int l,int r,int pos,int u) { if(l==r) {sum[k]=u; return;} if(pos<=mid) update(ls,l,mid,pos,u); if(pos>mid) update(rs,mid+1,r,pos,u); pushup(k); } ll query(int k,int l,int r,int ql,int qr) { if(ql<=l && r<=qr) return sum[k]; long long ans=0; if(ql<=mid) ans=query(ls,l,mid,ql,qr); if(qr>mid) ans=max(ans,query(rs,mid+1,r,ql,qr)); return ans; }
洛谷 P1198 最大數