用longlong才能A。。。。。。害我TLE了半天。。。。
用一个结构体记录,操作改变的区间范围 [ c1 , c2 ] , v ,youxiao
注意c1==c2时,并不一定表示一个有效的值所以需要一个标记。。。。
当这个区间表示一个有效的值时,v表示有效值。。。。。否则v表示重复了多少次(用来递推)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const long long int maxn5=1010000; struct Interval { long long int c1,c2,v,youxiao; }I[maxn5]; long long int n,m,ct,high; long long int getINT(long long int x) { long long int low=0,high=ct-1,mid,ans; while(low<=high) { mid=(low+high)>>1; if((x>I[mid].c1&&x<I[mid].c2)||x==I[mid].c1||x==I[mid].c2) { ans=mid; break; } else if(x>I[mid].c2) { low=mid+1; } else if(x<I[mid].c1) { high=mid-1; } } return ans; } int main() { scanf("%I64d",&m); while(m--) { long long int a,b,c; scanf("%I64d",&a); if(a==1) { scanf("%I64d",&b); I[ct++]=(Interval){high,high,b,1}; high++; } else if(a==2) { scanf("%I64d%I64d",&b,&c); I[ct++]=(Interval){high,high+c*b-1,c,0}; high=high+c*b; } } scanf("%I64d",&n); while(n--) { long long int x,ans; scanf("%I64d",&x); x--; ///>_< bool flag=true; while(flag) { long long int qj=getINT(x); if(I[qj].youxiao) { ans=I[qj].v; flag=false; break; } else if(!I[qj].youxiao) { int len=x-I[qj].c1; int jie=(I[qj].c2-I[qj].c1+1)/I[qj].v; x=len%jie; } } printf("%I64d ",ans); } putchar(10); return 0; }