传送门

分析

清华集训真的不是人做的啊嘤嘤嘤

我们可以考虑按操作时间把每个操作存进线段树里

如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点

我们不难发现一个区间会因为不同的操作被分成若干块,每块对应序列上不同的区间

于是查询时对于每个线段树上区间查询时二分查找当前点在哪一块中即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
int n,m,a[],Q,tot,Ans,cnt,L[],R[];
struct node {
int le,ri,a,b;
};
node d[];
inline void PUSH(int wh,int le,int ri,int aa,int bb){
d[wh].le=le,d[wh].ri=ri,d[wh].a=aa,d[wh].b=bb;
}
inline void update(int wh,int le,int ri){
int i,j,k,be=;
L[wh]=cnt+;
for(i=L[le],j=L[ri];i<=R[le]&&j<=R[ri];){
if(d[i].ri>=d[j].ri){
PUSH(++cnt,be,d[j].ri,d[i].a*d[j].a%m,(d[j].a*d[i].b+d[j].b)%m);
be=d[j].ri+;
if(d[i].ri==d[j].ri)i++;
j++;
}else {
PUSH(++cnt,be,d[i].ri,d[i].a*d[j].a%m,(d[j].a*d[i].b%m+d[j].b)%m);
be=d[i].ri+;
i++;
}
}
R[wh]=cnt;
}
inline void build(int le,int ri,int wh,int pl,int x,int y,int k1,int k2){
if(le==ri){
L[wh]=cnt+;
if(x>)PUSH(++cnt,,x-,,);
PUSH(++cnt,x,y,k1,k2);
if(y<n)PUSH(++cnt,y+,n,,);
R[wh]=cnt;
return;
}
int mid=(le+ri)>>;
if(mid>=pl)build(le,mid,wh<<,pl,x,y,k1,k2);
else build(mid+,ri,wh<<|,pl,x,y,k1,k2);
if(ri==pl)update(wh,wh<<,wh<<|);
}
inline void work(int wh,int pl){
int le=L[wh],ri=R[wh];
while(ri-le>){
int mid=(le+ri)>>;
if(pl<=d[mid].ri)ri=mid;
else le=mid+;
}
Ans=(Ans*d[le].a%m+d[le].b)%m;
}
inline void q(int le,int ri,int wh,int x,int y,int k){
if(le>=x&&ri<=y){
work(wh,k);
return;
}
int mid=(le+ri)>>;
if(mid>=x)q(le,mid,wh<<,x,y,k);
if(mid<y)q(mid+,ri,wh<<|,x,y,k);
}
signed main(){
int i,j,k,t;
scanf("%lld",&t);
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%lld",&Q);
for(i=;i<=Q;i++){
int le,ri,x,y;
scanf("%lld%lld%lld",&k,&le,&ri);
if(t&)le^=Ans,ri^=Ans;
if(k==){
scanf("%lld%lld",&x,&y);
tot++;
build(,Q,,tot,le,ri,x,y);
}else {
scanf("%lld",&x);
if(t&)x^=Ans;
Ans=a[x];
q(,Q,,le,ri,x);
printf("%lld\n",Ans);
}
}
return ;
}

最新文章

  1. 了解一下OOP的反射API
  2. 【转】T-SQL查询进阶—理解SQL Server中的锁
  3. C# 使用lock关键字lock不同的对象
  4. 查看80端口被占用的方法(IIS、apmserv、system)
  5. ACM——完数
  6. [CSAPP笔记][第十章 系统级I/O]
  7. Java Dom解析xml
  8. 双线服务器和CDN的区别
  9. 项目(1)----用户信息管理系统(4)---(struts开发)
  10. equals和hashCode详解
  11. Vue使用vue-echarts图表
  12. RAS非对称加密与数字证书数字签名
  13. ElasticSearch6.5.0【Java客户端之TransportClient】
  14. RISC-V架构简介
  15. scala-02-基本数据类型-string-分支循环
  16. JSTL核心标签库——&lt;c:set&gt;标签、&lt;c:out&gt;标签
  17. CentOS安装CLI
  18. Python3 itchat微信获取好友、公众号、群聊的基础信息
  19. #if #endif #elif #undef
  20. 什么是IIS并发连接数

热门文章

  1. SSM框架——Spring+SpringMVC+Mybatis的搭建
  2. Django json处理
  3. 【sqlite】错误代码整理
  4. LOJ10042 收集雪花
  5. 洛谷 P2920 [USACO08NOV]时间管理Time Management
  6. 【LeetCode】汇总
  7. 【Swift 】- 闭包
  8. IT售前经验谈
  9. Host ASP.NET WebApi in Owin
  10. java md5 函数